麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Ruby > 正文

Ruby元編程小結(jié)

2020-10-29 19:43:08
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

今天被問(wèn)到此類問(wèn)題,以前總是覺得這個(gè)是比較寬泛的一個(gè)概念,自己即使是用過(guò)這些特性,但卻一直不知道這叫“元編程” 直到今天被人問(wèn)起的時(shí)候,方才頓悟一些,隨后便在網(wǎng)上和自己的平實(shí)用的一些元編程做個(gè)小總結(jié)。

原來(lái)所謂的Ruby中的元編程,是可以在運(yùn)行時(shí)動(dòng)態(tài)的操作語(yǔ)言結(jié)構(gòu)(如類、模塊、實(shí)例變量等)的技術(shù)。你甚至于可以在不用重啟的情況下,在運(yùn)行時(shí)直接鍵入一段新的Ruby代碼,并執(zhí)行他。 

Ruby的元編程,也具有“利用代碼來(lái)編寫代碼”的作用。例如,常見的attr_accessor等方法就是如此。 
 
首先我能想到的自己用過(guò)的有這么幾個(gè): 

1,respond_to? 
2,define_method 
3,instance_variable_get, instance_variable_set 
4,eval 不過(guò)這個(gè)方法能盡量避免就避免,執(zhí)行效率特別低!! 

具體的意思想必一看方法名字 就知道這些方法的所要實(shí)現(xiàn)的邏輯。 
具體可詳見http://api.rubyonrails.org/ 上具體分析源碼,很簡(jiǎn)單。 
 
以下是我從其他地方搜索而來(lái),以便以后的工作中有助于提高自己的編程技能;  
 
1,內(nèi)省,反射 

在Ruby中,你完全有能力在運(yùn)行時(shí)查看類或?qū)ο蟮男畔ⅰN覀兛梢允褂胏lass、 instance_methods、  intance_variables等方法來(lái)達(dá)到目的。我們講這種技術(shù)成為內(nèi)省(Introspection)或者反射(Reflection)。 

一說(shuō)編寫元程序的語(yǔ)言稱之為元語(yǔ)言。被操縱的程序的語(yǔ)言稱之為目標(biāo)語(yǔ)言。一門編程語(yǔ)言同時(shí)也是自身的元語(yǔ)言的能力稱之為反射或者自反。 ――摘自維基百科元編程條目。

復(fù)制代碼 代碼如下:
 
classRubyist 
  defwhat_does_he_do 
    @person='A Rubyist' 
    'Ruby programming' 
  end 
end 
   
an_object = Rubyist.new 
puts an_object.class# => Rubyist 
puts an_object.class.instance_methods(false)# => what_does_he_do 
an_object.what_does_he_do 
puts an_object.instance_variables# => @person 

 
 respond_to?方法是反射機(jī)制中另一個(gè)有用的方法。使用respond_to?方法,可以提前知道對(duì)象是否能夠處理你想要交與他執(zhí)行的信息。所有的對(duì)象都有此方法,使用respond_to?方法,你可以確定對(duì)象是否能使用指定的方法。  
 
2,instance_eval 
  Object類提供了一個(gè)名為instance_eval的公開方法,該方法可被一個(gè)實(shí)例調(diào)用。他提供了操作對(duì)象的實(shí)例變量的途徑。可以使用字符串向此方法傳遞參數(shù)或者傳遞一個(gè)代碼塊。 
復(fù)制代碼 代碼如下:

classRubyist 
  definitialize 
    @geek="Matz" 
  end 
end 
obj = Rubyist.new 
 
# instance_eval可以操縱obj的私有方法以及實(shí)例變量 
  
obj.instance_evaldo 
  putsself# => #puts@geek# => Matz 
end 
 
 
 通過(guò)instance_eval傳遞的代碼塊使得你可以在對(duì)象內(nèi)部操作。你可以在對(duì)象內(nèi)部肆意操縱,不再會(huì)有任何數(shù)據(jù)是私有的!instance_eval亦可用于添加類方法。 

復(fù)制代碼 代碼如下:
 
classRubyist 
end 
   
Rubyist.instance_evaldo 
  defwho 
    "Geek" 
  end 
end 
   
puts Rubyist.who# => Geek 
 
 
const_get, const_set 

類似的,const_get和const_set用于操作常量。const_get返回指定常量的值: 
復(fù)制代碼 代碼如下:
 
puts Float.const_get(:MIN)# => 2.2250738585072e-308 

const_set為指定的常量設(shè)置指定的值,并返回該對(duì)象。如果常量不存在,那么他會(huì)創(chuàng)建該常量,就是下面示范的那樣: 
復(fù)制代碼 代碼如下:
 
classRubyist 
end 
puts Rubyist.const_set("PI",22.0/7.0)# => 3.14285714285714 
 
  因?yàn)閏onst_get返回常量的值,因此,你可以使用此方法獲得一個(gè)類的名字并為這個(gè)類添加一個(gè)新的實(shí)例化對(duì)象的方法。這樣使得我們有能力在運(yùn)行時(shí)創(chuàng)建類并實(shí)例化其實(shí)例。 
復(fù)制代碼 代碼如下:
 
# Let us call our new class 'Rubyist' 
# (we could have prompted the user for a class name) 
class_name ="rubyist".capitalize 
Object.const_set(class_name,Class.new) 
# Let us create a method 'who' 
# (we could have prompted the user for a method name) 
class_name =Object.const_get(class_name) 
puts class_name# => Rubyist 
class_name.class_evaldo 
  define_method:whodo|my_arg| 
    my_arg 
  end 
end 
obj = class_name.new 
puts obj.who('Matz')# => Matz

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 精品久久中文字幕 | 青青草免费观看 | 9191色 | 少妇一级淫片高潮流水电影 | 久久精品伊人网 | 一本色道久久综合亚洲精品图片 | 美女视频免费一区二区 | 日本中文字幕高清 | 成人免费毛片在线观看 | 成人国产精品一区二区毛片在线 | 日日摸夜夜添夜夜添牛牛 | 精品一区二区视频在线观看 | 黄视频免费在线观看 | 精品欧美一区二区精品久久 | 免费国产自久久久久三四区久久 | 7777奇米成人四色影视 | 99亚洲伊人久久精品影院红桃 | 久久久久久久久久久高潮一区二区 | 伊人在线视频 | 欧美一级黄视频 | 欧美特黄a | 热99在线视频 | 粉嫩粉嫩一区二区三区在线播放 | 成人国产精品久久 | 精品久久久久久久久久久久久 | 成人免费毛片在线观看 | 成人免费精品视频 | 一本色道久久综合亚洲精品小说 | 欧美精品亚洲人成在线观看 | 久久精品伊人网 | 久久成人午夜视频 | 国产va在线观看 | 日本在线不卡一区二区三区 | v11av在线视频成人 | 免费a视频在线观看 | 欧美性受xxxxxx黑人xyx性爽 | 美女视频免费一区二区 | 欧美 日韩 三区 | 亚洲婷婷日日综合婷婷噜噜噜 | 牛牛碰在线视频 | 嗯~啊~弄嗯~啊h高潮视频 |