中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Ruby中的反射(Reflection)應用實例
來源:易賢網 閱讀:1616 次 日期:2014-06-30 21:39:15
溫馨提示:易賢網小編為您整理了“Ruby中的反射(Reflection)應用實例”,方便廣大網友查閱!

這篇文章主要介紹了Ruby中的反射(Reflection)應用實例,實現通過一個類名字符串構造一個類對象和訪問成員變量和私有方法,需要的朋友可以參考下。

在Java語言中,提供了發射機制,通過發射機制可以通過字符串構造出這個對象,可以獲取對象的所有方法(包括私有方法),可以調用私有方法,可以更改成員變量的值(包括私有的成員變量)。

Ruby也是面向對象的高級語言,當然也提供了反射機制,今天我們討論通過類名稱構造類對象的功能。

一、通過類名稱構造類對象

我們先看普通的構造:

代碼如下:

moduleModuleA

#theclassname,laterwewilluseittocreatethecorrespondingobject

CLASS_NAME_OF_WOOD="ModuleA::Wood"

CLASS_NAME_OF_WOODDESK="ModuleA::WoodDesk"

CLASS_NAME_OF_WOODCHAIR="ModuleA::WoodChair"

classWood

definitialize

@desc="Iamaprimalwood"

end

defsay

puts@desc

end

end

classWoodDesk<Wood

definitialize

@desc="Iamadeskmadeofwood"

end

defsay_private

puts"actually,ihavesomebugbutnopublic"

end

public:say

private:say_private

end

classWoodChair<Wood

definitialize

@desc="Iamachairmadeofwood"

end

defsay_private

puts"IWantgetmarriedwithaWoodDesk..."

end

defsmile

puts"hahahhahhaha...."

end

public:say

private:say_private,:smile

end

end

定義了一個基礎類Wood,有兩個子類:WoodDesk,WoodChair,子類有分別有一個私有方法say_private。

我們new出對象來執行:

代碼如下:

#thenormalinitailze

wood=ModuleA::Wood.new

wood.say

desk=ModuleA::WoodDesk.new

desk.say

chair=ModuleA::WoodChair.new

chair.say

#trycalltheprivatemethod

puts"deskrespondtosay_private?#{desk.respond_to?:say_private}"

desk.say_privateifdesk.respond_to?:say_private

上面代碼,執行public方法say,然后嘗試執行private方法say_private,執行先check是否能夠執行,返回結果是不能執行,desk.respond_to?:say_private返回false:

代碼如下:

Iamaprimalwood

Iamadeskmadeofwood

Iamachairmadeofwood

deskrespondtosay_private?false

好,現在我們通過反射機制來構造對象,并嘗試執行其私有方法。

我們注意到模塊的定義中有三個常量,定義的是類名稱,

代碼如下:

#theclassname,laterwewilluseittocreatethecorrespondingobject

CLASS_NAME_OF_WOOD="ModuleA::Wood"

CLASS_NAME_OF_WOODDESK="ModuleA::WoodDesk"

CLASS_NAME_OF_WOODCHAIR="ModuleA::WoodChair"

下面會通過這三個變量來理解Module.constants方法。

下面代碼片段,基于上面的類定義:

代碼如下:

#getallmoduleconstants

obj_list=Array.new

tmp_const_sym_list=ModuleA.constants

tmp_const_sym_list.eachdo|sym|

obj_list<<ModuleA.const_get(sym)

puts"calss=#{sym.class},value=#{sym}"

end

我們注意到ModuleA.constants,這個方法是Module模塊中的,其作用是返回模塊中所有常量的Symbol對象。我們看結果輸出:

代碼如下:

calss=Symbol,value=CLASS_NAME_OF_WOOD

calss=Symbol,value=CLASS_NAME_OF_WOODDESK

calss=Symbol,value=CLASS_NAME_OF_WOODCHAIR

calss=Symbol,value=Wood

calss=Symbol,value=WoodDesk

calss=Symbol,value=WoodChair

從結果中看到,定義的三個常量和類名稱都被返回了。所以注意:Ruby中的常量是包含定義的常量(變量)和類名稱,注意他們都是Symbol對象。。

不過我們是需要根據類名稱構造類對象,那么那三個常量就是沒用的,需要刪除。我們通過正則表達式匹配名字,來過濾。上面的代碼修改一下:

代碼如下:

#getallmoduleconstants

sym_list=Array.new

tmp_const_sym_list=ModuleA.constants

tmp_const_sym_list.eachdo|sym|

puts"calss=#{sym.class},value=#{sym}"

sym_list<<ModuleA.const_get(sym)if/^Wood\w*/=~sym.to_s

end

sym_list<<ModuleA.const_get(sym)if/^Wood\w*/=~sym.to_s,僅保存以Wood開頭的symbol,這樣我們就過濾掉了那三個常量。

找都類名稱之后,開始構造對象:

代碼如下:

#createobjectfromsymbol

obj_list=Array.new

sym_list.eachdo|sym|

obj=sym.new

obj_list<<obj

puts"createtheobject:#{obj}"

end

begin

obj_list.eachdo|wood|

wood.say

end

調用Symbol的new方法構造出次對象(sym.new),然后我們調用對象的say方法:

代碼如下:

createtheobject:#

createtheobject:#

createtheobject:#

Iamaprimalwood

Iamadeskmadeofwood

Iamachairmadeofwood

達到了我們預期的結果。

二、操作成員變量和私有方法

使用過Java反射的同學們都知道,有了對象之后,操作成員變量和私有方法也就不在話下了。

Ruby中也是一樣。

先看操作成員變量的例子。我們嘗試更改一個成員變量的值。(接著上一片文章的代碼)

代碼如下:

#manpulateinstancevariables

first_wood=obj_list.first

first_wood.instance_variables.eachdo|var|

#gettheinstancevariable

puts"classofvar=#{var.class},valueofvar=#{var}"

var_value=first_wood.instance_variable_get(var)

puts"classofvar_value=#{var_value.class},valueofvar_value=#{var_value}"

#setthenewvalueofinstancevarialbe

first_wood.instance_variable_set(var,var_value+"...andiwaschanged.")

first_wood.say

end

1、first_wood.instance_variables.each,我們得到一個Wood對象,然后調用其instance_variables方法得到所有成員變量的名稱(Symbol對象)。

2、然后,調用對象的first_wood.instance_variable_get方法,傳遞成員變量名稱,得到成員變量對象。

3、最后,我們通過first_wood.instance_variable_set,改變這個成員變量的值。

代碼運行結果:

代碼如下:

classofvar=Symbol,valueofvar=@desc

classofvar_value=String,valueofvar_value=Iamaprimalwood

Iamaprimalwood...andiwaschanged.

再看調用私有方法:

代碼如下:

#callprivatemethod

last_wood=obj_list.last

last_wood.method(:say_private).call

很簡單,如果你知道方法名稱,調用last_wood.method傳入方法名,就可以得到一個Method對象,然后調用Method對象的call方法,結果是私有方法輸出的內容:

代碼如下:

IWantgetmarriedwithaWoodDesk...

普通場景下用不到修改成員變量和調用私有方法,因為這是違反了面向對象的封裝原則的,那么反射在什么場景下有用呢?從我個人經驗來說我覺得兩個地方有用:

1)單元測試。

2)面向方面編程。

這兩種場景都需要調用私有方法或替換成員變量的值。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
易賢網手機網站地址:Ruby中的反射(Reflection)應用實例
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
99热免费精品| 美女性感视频久久久| 狼人天天伊人久久| 欧美一级视频| 亚洲精品国产日韩| 亚洲视频免费观看| 久久精品亚洲精品国产欧美kt∨| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲图片欧美日产| 极品少妇一区二区三区精品视频| 在线成人免费观看| 亚洲美女尤物影院| 国产一区二区中文| 国产精品日韩电影| 欧美成人有码| 久久综合狠狠综合久久激情| 午夜精品久久久久久久久久久久久 | 夜夜爽99久久国产综合精品女不卡 | 国产精品三级视频| 国产日韩欧美视频| 国产精一区二区三区| 国产精品久久久免费| 欧美亚洲成人免费| 国产精品五月天| 影音先锋久久精品| 最新亚洲电影| 亚洲网站在线播放| 好看的av在线不卡观看| 亚洲欧美日韩一区在线| 国产精品久久久久毛片软件 | 欧美影院视频| 国产丝袜美腿一区二区三区| 国产欧美在线视频| 国产精品久久久亚洲一区| 欧美成人资源| 亚洲午夜电影网| 亚洲第一区色| 亚洲第一区在线观看| 亚洲成色www久久网站| 欧美成人激情在线| 一本色道久久综合亚洲精品不 | 亚洲欧美日韩一区二区| 欧美大片91| 国产精品99久久久久久久久久久久| 女同一区二区| 国产午夜精品全部视频在线播放| 亚洲欧洲另类国产综合| 亚洲国产91色在线| 欧美成人国产一区二区| 国产专区精品视频| 老司机67194精品线观看| 亚洲精品三级| 国产精品美女主播| 欧美激情一区二区三级高清视频 | 亚洲精选91| 久久人91精品久久久久久不卡| 欧美日韩国产综合新一区| 激情懂色av一区av二区av| 欧美一级黄色网| 欧美破处大片在线视频| 一区二区三区四区在线| 亚洲一区在线播放| 在线成人激情视频| 欧美88av| 亚洲成色777777女色窝| 亚洲一区二区3| 亚洲成人在线网站| 国产精品国产三级国产aⅴ入口| 国产日韩欧美精品在线| 欧美激情中文字幕一区二区| 亚洲婷婷综合久久一本伊一区| 国产精品综合色区在线观看| 久久久人人人| 欧美一区国产二区| 亚洲小视频在线观看| 国产一区二区三区自拍| 在线播放国产一区中文字幕剧情欧美| 欧美夫妇交换俱乐部在线观看| 亚洲精品一区中文| 国产人成精品一区二区三| 欧美激情中文不卡| 久久精品国产清高在天天线| 亚洲国产精品热久久| 媚黑女一区二区| 欧美激情精品久久久| 中国日韩欧美久久久久久久久| 亚洲成色精品| 国产婷婷色一区二区三区在线 | 亚洲欧美国产精品桃花| 亚洲天天影视| 久久天天狠狠| 国产精品网站视频| 亚洲福利视频在线| 欧美一区二区三区视频在线观看| 亚洲精品乱码久久久久久黑人| 亚洲欧洲日产国码二区| 国产精品夫妻自拍| 亚洲一区免费视频| 久久国产加勒比精品无码| 欧美成人黑人xx视频免费观看| 国产精品免费看片| 国产一区二区日韩| 亚洲国产综合在线看不卡| 亚洲一区二区三区精品视频 | 最新国产成人在线观看| 欧美激情综合色| 国产欧美视频一区二区三区| 国产精品视频一二| 亚洲精品一区二区三区福利| 在线一区二区三区做爰视频网站| 久久久美女艺术照精彩视频福利播放| 久久久999精品| 国产日韩在线看片| 亚洲欧美成人网| 欧美日韩精品免费观看| 国产偷国产偷精品高清尤物| 亚洲狠狠婷婷| 久久精品首页| 美女诱惑一区| 亚洲视频网在线直播| 先锋影音国产精品| 欧美精品v日韩精品v韩国精品v| 国产亚洲美州欧州综合国| 亚洲欧美国产视频| 欧美视频在线不卡| 亚洲午夜在线观看视频在线| 欧美精品久久久久久久| 极品尤物一区二区三区| 亚洲深夜福利| 欧美激情第五页| 最新国产成人av网站网址麻豆 | 国产精品一国产精品k频道56| 久久国产88| 亚洲在线一区二区三区| 亚洲麻豆国产自偷在线| 精品福利免费观看| 欧美精品一区二区三区久久久竹菊| 亚洲国产成人在线播放| 欧美日韩国产成人在线| 亚洲免费影视| 亚洲特级片在线| 国产精品一区在线观看| 欧美视频一区二区三区| 久久久久这里只有精品| 亚洲第一狼人社区| 国产欧美一级| 狠狠色香婷婷久久亚洲精品| 国产在线视频欧美| 国产一区二区三区黄视频| 久久综合九九| 亚洲一区欧美| 亚洲精品影视| 亚洲国产精品久久久久久女王| 欧美三级第一页| 欧美激情精品久久久久| 亚洲一区二区日本| 一区二区三区久久久| 妖精成人www高清在线观看| 日韩午夜在线播放| 久久婷婷一区| 国产精品久久久久毛片大屁完整版| 亚洲一本大道在线| 亚洲一区二区三区在线看| 亚洲精华国产欧美| 91久久一区二区| 亚洲视频在线观看网站| 亚洲特色特黄| 亚洲国产高清在线观看视频| 欧美日本国产| 一区二区在线视频| 夜夜躁日日躁狠狠久久88av| 亚洲黄色成人久久久| 日韩亚洲欧美一区二区三区| 曰韩精品一区二区| 宅男噜噜噜66一区二区| 一本色道久久综合亚洲精品按摩| 在线电影欧美日韩一区二区私密| 国产日韩欧美成人| 国产精品每日更新| 在线欧美三区| 亚洲理论电影网| 亚洲精品久久嫩草网站秘色| 午夜日韩电影| 欧美成人中文字幕| 在线看片成人| 午夜精品久久久99热福利| 久久久久久国产精品一区| 欧美日韩1080p| 国产欧美日韩不卡免费| 亚洲精品在线免费观看视频| 日韩视频三区| 欧美日本国产一区| 亚洲国产日韩一区| 久久综合色88| 激情综合亚洲| 久久成人精品电影| 国产欧美一区二区精品性色| 亚洲最新合集| 亚洲视频免费| 蘑菇福利视频一区播放|