之前,我在這篇[OLD]Ruby的eval函式 - 最簡單的metaprogramming中有簡單介紹一下ruby的動態特性,最近看了這篇根据类名创建实例——Ruby实现後,又發現其實裡面有很大的玄機啊...在我之前的文章中,我是使用
creature_class = gets
eval( "creature = " + creature_class + ".new" )
的方式來動態建立新物件,但是我們要怎麼利用我們建立的creature物件呢?在irb中的測試:
str = "Array" => "Array"
eval "something = #{str}.new" => [ ]
p obj => [ ]
obj << 1 => [1]
所以是可以正常執行的,直接編寫成.rb檔在執行也是一樣結果,並沒有該文中所謂的「irb和Ruby不兼容」的問題,看來有修正了,可喜可賀。
--
但是,有沒有更好的辦法呢?第一種是簡短的方法:
str = "Array"
something = eval(str).new
你可以在irb底下試試看,直接輸入Array這五個字母,就會得到Array這個類別名稱,再接著呼叫該類別名稱的new方法即可建立一個新物件。
第二種:標準的方法。
這個方法利用了一個事實:所有東西在Ruby裡面都是個物件常數(常量?)(object),object是所有物件的根源。
c = Object.const_get("Array")
s = c.new
所以我們利用Object物件的const_get方法(Returns the value of the named constant)去取得類別的名字,接著在呼叫該類別的new方法,其實也差不多。
請先 登入 以發表留言。