Re: [問題] Module觀念的問題
※ 引述《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
02/01 15:09, 1F
→
02/01 15:09, , 2F
02/01 15:09, 2F
推
02/01 19:58, , 3F
02/01 19:58, 3F
推
02/01 21:15, , 4F
02/01 21:15, 4F
→
02/01 21:24, , 5F
02/01 21:24, 5F
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章