What have you found for these years?

2009-07-15

instance_exec

這也算是個討論了不少的東西,不過我從來沒搞懂過到底想幹嘛?
自己試了一下,還有細看了一下討論(之前都瞥過而已 @@),
總算大概知道是怎樣了... 其實說穿了也沒什麼,小事而已。

instance_eval no longer yielding self in ruby 1.9

簡單地說,就是如果我們把原本用在 instance_eval 裡的 block,
改成 receiver 當成第一參數,那麼:

self.instance_eval(&block)

Block#call(self)

就應該是可以任意置換(interchanged)的。
如此,我們不需要切換 binding 也能任意套用在任何 context.
差異當然是原本可以直接存取 private 與 instance variable,
現在變成外部存取,會多一道手續透過 send 與
instance_variable_get/set 等等。

不過或許也可以因此強迫把介面設計得好一點。

而引用的討論是在說,因為在 1.8 裡面,會有這樣的動作:
instance_eval{ |this| }
他會把 self pass 進去,因此 instance_eval 會等同於
instance_exec(self, &block)
不過在 1.9 裡,已經不會這樣做了。原因我不確定...
(喔,原因在這:Method object used as
Object#instance_eval block doesn't work (as expected)

簡單地說就是... 咱 revert 回去吧 XD)

但總之,instance_exec 看來就是 instance_eval 的超集,
或許可以考慮拿掉 instance_eval, 然後把 instance_exec
改名成 instance_eval...

因為現在 1.9 的內建 method 已經有點太多了...

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0