作者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