Re: [問題] Module觀念的問題

看板Ruby作者 (godfat 真常)時間18年前 (2007/02/01 13:02), 編輯推噓3(302)
留言5則, 3人參與, 最新討論串5/5 (看更多)
※ 引述《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

02/01 15:09, , 1F
其實我不知道能直接寫 ::B ...... Orz
02/01 15:09, 1F

02/01 15:09, , 2F
板主自己 m 一個吧 XDD
02/01 15:09, 2F

02/01 19:58, , 3F
應要求 XDD
02/01 19:58, 3F

02/01 21:15, , 4F
咪的,那 #512 也 m 一下,雖然我看不懂
02/01 21:15, 4F

02/01 21:24, , 5F
那下一個 m #1024 XD
02/01 21:24, 5F
文章代碼(AID): #15mNHtAc (Ruby)
文章代碼(AID): #15mNHtAc (Ruby)