看板 Ruby 關於我們 聯絡資訊
※ 引述《yzugsr (Bird)》之銘言: : ※ 引述《yzugsr (Bird)》之銘言: : : 我好像沒講清楚 @@ : : 簡單來說,我是希望在module A中evaluate一個字串 : : 創造出::B的物件(而非A::B) 也就是說不要在A的nesting之下 : 自己try出來了 : module A : def self.test : str = "class B; end" : Object.class_eval(str) : end : end : A.test : 加了紅字就會建出::B,不加就會建出A::B : 其實我也不知其所以然.... 容我推測 沒寫 Object. 當然是 self. 的意思 亦即以當前 scope 為基準,在 A.test 中當然是指 A 所以產生出來的 class 自然是在 A 裡面了 如果你寫成 Object. 的話,就變成寫到 Object 這個 class 裡面 所以 B 其實是 Object::B 而非 ::B 只是 global(top-level)同樣是一個 Object, 所以你會覺得好像是在 global 裡,但其實他是在 Object 裡 也就是說其實你還可以這樣寫: A.test # 產生 Object.B B::B.new # 產生 B 的 B XD B::B::B::B.new # 產生 B 的 B 的 B 的 B XD class T; end T::B::B.new # T 底下也有 B 喔… 不過經過我剛剛測試的結果,這樣其實會有 warning 的 warning: toplevel constant B referenced by B::B 所以比較建議的方式是 module A def self.test str = "class B; end" Kernel.class_eval(str) end end A.test 這樣的話,就不能做像上面那樣的蠢事了 但還是每個地方都能存取到 B,(which is a constant refer to a Class) 因為 Kernel 是被 include 至 Object 裡的 另外個人比較建議使用 module_eval 而不是 class_eval, 這兩個基本上是完全相同的,之所以說比較建議前者是因為: Class 也是一種(kind_of?)Module, 所以 module_eval 比較合乎 Ruby 本身的物件結構。當然這只是個人感覺,既然兩者同義, 任何一個又沒有被 deprecated, 所以用哪個就看個人喜好了 -- 「行け!Loki!」(rocky ロッキー) -Gurumin ぐるみん 王子? XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.28.18
polarpolar:其實我不知道能直接寫 ::B ...... Orz 02/01 15:09
polarpolar:板主自己 m 一個吧 XDD 02/01 15:09
godfat:應要求 XDD 02/01 19:58
PsMonkey:咪的,那 #512 也 m 一下,雖然我看不懂 02/01 21:15
godfat:那下一個 m #1024 XD 02/01 21:24