Ruby元編程小結(jié)
今天被問到此類問題,以前總是覺得這個是比較寬泛的一個概念,自己即使是用過這些特性,但卻一直不知道這叫“元編程” 直到今天被人問起的時候,方才頓悟一些,隨后便在網(wǎng)上和自己的平實用的一些元編程做個小總結(jié)。
原來所謂的Ruby中的元編程,是可以在運行時動態(tài)的操作語言結(jié)構(gòu)(如類、模塊、實例變量等)的技術(shù)。你甚至于可以在不用重啟的情況下,在運行時直接鍵入一段新的Ruby代碼,并執(zhí)行他。
Ruby的元編程,也具有“利用代碼來編寫代碼”的作用。例如,常見的attr_accessor等方法就是如此。
首先我能想到的自己用過的有這么幾個:
1,respond_to?
2,define_method
3,instance_variable_get, instance_variable_set
4,eval 不過這個方法能盡量避免就避免,執(zhí)行效率特別低??!
具體的意思想必一看方法名字 就知道這些方法的所要實現(xiàn)的邏輯。
具體可詳見http://api.rubyonrails.org/ 上具體分析源碼,很簡單。
以下是我從其他地方搜索而來,以便以后的工作中有助于提高自己的編程技能;
1,內(nèi)省,反射
在Ruby中,你完全有能力在運行時查看類或?qū)ο蟮男畔?。我們可以使用class、 instance_methods、 intance_variables等方法來達到目的。我們講這種技術(shù)成為內(nèi)?。↖ntrospection)或者反射(Reflection)。
一說編寫元程序的語言稱之為元語言。被操縱的程序的語言稱之為目標語言。一門編程語言同時也是自身的元語言的能力稱之為反射或者自反。 ——摘自維基百科元編程條目。
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?方法是反射機制中另一個有用的方法。使用respond_to?方法,可以提前知道對象是否能夠處理你想要交與他執(zhí)行的信息。所有的對象都有此方法,使用respond_to?方法,你可以確定對象是否能使用指定的方法。
2,instance_eval
Object類提供了一個名為instance_eval的公開方法,該方法可被一個實例調(diào)用。他提供了操作對象的實例變量的途徑??梢允褂米址虼朔椒▊鬟f參數(shù)或者傳遞一個代碼塊。
classRubyist
definitialize
@geek="Matz"
end
end
obj = Rubyist.new
# instance_eval可以操縱obj的私有方法以及實例變量
obj.instance_evaldo
putsself# => #puts@geek# => Matz
end
通過instance_eval傳遞的代碼塊使得你可以在對象內(nèi)部操作。你可以在對象內(nèi)部肆意操縱,不再會有任何數(shù)據(jù)是私有的!instance_eval亦可用于添加類方法。
classRubyist
end
Rubyist.instance_evaldo
defwho
"Geek"
end
end
puts Rubyist.who# => Geek
const_get, const_set
類似的,const_get和const_set用于操作常量。const_get返回指定常量的值:
puts Float.const_get(:MIN)# => 2.2250738585072e-308
const_set為指定的常量設(shè)置指定的值,并返回該對象。如果常量不存在,那么他會創(chuàng)建該常量,就是下面示范的那樣:
classRubyist
end
puts Rubyist.const_set("PI",22.0/7.0)# => 3.14285714285714
因為const_get返回常量的值,因此,你可以使用此方法獲得一個類的名字并為這個類添加一個新的實例化對象的方法。這樣使得我們有能力在運行時創(chuàng)建類并實例化其實例。
# 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
相關(guān)文章
Ruby on Rails所構(gòu)建的應(yīng)用程序基本目錄結(jié)構(gòu)總結(jié)
Ruby on Rails是Ruby世界中一家獨大的Web開發(fā)框架,要掌握Rails程序的構(gòu)建,對其目錄結(jié)構(gòu)的了解十分必要,下面就來看一下Ruby on Rails所構(gòu)建的應(yīng)用程序基本目錄結(jié)構(gòu)總結(jié)2016-05-05
win7安裝ruby on rails開發(fā)環(huán)境
看到很多文章都說ruby環(huán)境在windows上是非常難搭建,會出現(xiàn)各種各樣的怪問題,所以都推薦到linux和mac上安裝開發(fā)。但是我按照教程搭了下,問題也不算太多??傔^大概花費了2個半小時左右就完成了。下面就把安裝的步驟及具體的版本記錄了一下供大家參考。2014-07-07
ruby+nokogori抓取糗事百科前10頁并存儲進數(shù)據(jù)庫示例
這篇文章主要介紹了ruby+nokogori抓取糗事百科前10頁并存儲進數(shù)據(jù)庫示例,需要的朋友可以參考下2014-05-05

