作者godfat (godfat 真常)
看板Ruby
標題Re: [Ruby] ruby 1.9 new features
時間Sat Dec 8 16:46:20 2007
※ 引述《contagious (漂移胖)》之銘言:
: ※ 引述《godfat (godfat 真常)》之銘言:
: : 騙人,明明就可以,而且也沒有 __send, __send!, send!
: : 所以現在是維持 1.8 不改?
: 它寫的是 doesn't "always"
: 在 1.8 裡的行為是..如果你用 bar.send(:foo)
: 如果 bar 裡有 public 的 foo 也有 private 的 foo ,會用 private 的 foo
嗯...翻了一下討論串,看到有人指出為什麼
foo.bar
和
foo.send :bar
會是不同的情況...(連 matz 一開始都覺得可能是 bug...)
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/153723
也就是說,foo.bar 看不到 private method,
所以會 invoke method_missing; 然而,foo.send :bar 看得到,
所以如果有個 foo 有個 private method :bar,
則 foo.send :bar 會 invoke 該 method 而非 method_missing.
原發問者提出了個 workaround:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/153749
透過 eval 來達成看不到 private method 的 send...
嗯,這恐怕確實是個滿大的問題,但我測試現在手上的 ruby 1.9,
行為還是跟 ruby 1.8 一致,也沒有上述提到的幾個 send!, __send, __send!
其實 ruby 裡有不少一致性很低,例外很多的狀況,我覺得實在不是個好現象。
有點像是為了便利妥協,但是造成不少意外...
希望以後可以有更高的一致性,不要老是有奇怪的意外
edited:
更正,根據這篇:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/153828
fcall 可以呼叫 private method, 而 send 不可以。
但是現行的 ruby 1.9 似乎是相反,
send 看得到 private method, 而 fcall 看不到 :D
以後要改用 fcall 了...
暴力 send 則用 __send__ 吧
edited2:
但 fcall 的行為和一般 method_missing 又不一樣 :(
msg 會是 fcall, 而原本的 msg 則成為 args.first...
def method_missing msg, *args
puts msg, args.join
end
這樣還是不行啊 -_-b
edited3:
昏倒,有夠詭異,新 class 有 send!, __send, __send!,
而內建的 Fixnum, String, 都沒有...
可能 std lib 還沒更新?
而且說詞正好全部相反,反而是 send!, __send, __send!, fcall 看不到 private.
而且每個對 method_missing 都是有問題的...
看來 ruby 1.9 xmas 恐怕是來不及,頂多來個 beta 吧...
--
『風車』が廻り続ける度に 『美しき』幻想が静かに紡がれ
『焔』の揺らめきの外に 『腕』を伸ばす愚かな者達 -《Roman》5th Story
『宝石』をより多く掴もうと 『朝と夜』の狭間を彷徨い続ける Track 10
『星屑』の砂の煌めきにも 『葡萄酒』の仄甘い陶酔を魅せ 黄昏の賢者
『賢者』が忌避する檻の中から 『伝言』の真意を彼等に問うだろう
『天使』が别れを告げし時 『地平線』は第五の物語を識る
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
※ 編輯: godfat 來自: 220.135.28.18 (12/08 16:58)
1F:推 Tiberius:這篇好像看出不少 Ruby 跟 Python 的想法差異 ... XD 12/08 18:13
2F:推 godfat:Python 我不太熟,可以講講嗎? :p 12/08 19:11