浏览 832 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2008-01-18
今天我在看RSL中的benchmark的源代码中发现下面这个函数
def memberwise(op, x)
case x
when Benchmark::Tms
Benchmark::Tms.new(utime.__send__(op, x.utime),
stime.__send__(op, x.stime),
cutime.__send__(op, x.cutime),
cstime.__send__(op, x.cstime),
real.__send__(op, x.real)
)
else
Benchmark::Tms.new(utime.__send__(op, x),
stime.__send__(op, x),
cutime.__send__(op, x),
cstime.__send__(op, x),
real.__send__(op, x)
)
end
end
不知道其中的__send__是什么意思,请哪位大侠给解释一下,多谢 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
__send__和send的功能是一样的.
不过这里有篇文章你可以看一下: http://blog.brightredglow.com/2007/9/20/send-my-love-to-ruby-ii |
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
两个是没区别,但是从小日本的文档中"send が再定義された場合に備えて別名 __send__ も用意されており、ライブラリではこちらを使うべきです。また __send__ は再定義すべきではありません。"
=>大概意思是"但你redefine send方法的时候,要用原来的send可以用__send__,不鼓励同时redefine send和__send__"
class Apple
def seed(arg)
puts "hello#{arg}"
end
def send(method,*arg)
puts "#{method}__#{arg}"
self.__send__(method,arg)
end
end
a = Apple.new
a.send :seed,"hello"
C:\>jruby test.rb seed__hello hellohello 但是小日本文档中还提到 "ruby 1.9 feature: 呼び出し制限がsend, __send__にも影響するようになり、レシーバを指定した呼び出しではprivateメソッドを呼び出せなくなりました。 privateメソッドを呼び出す必要がある場合はinstance_evalを使用してください" 不知道怎么解释 |
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
Transformers 写道 但是小日本文档中还提到 "ruby 1.9 feature: 呼び出し制限がsend, __send__にも影響するようになり、レシーバを指定した呼び出しではprivateメソッドを呼び出せなくなりました。 privateメソッドを呼び出す必要がある場合はinstance_evalを使用してください" 不知道怎么解释 send doesn't always call private methods anymore class Foo
private
def foo
"aa"
end
end
p Foo.new.__send!(:foo) # => nil
p Foo.new.send(:foo) #private method `foo' called for #<Foo:0xa89530> (NoMethodError)
|
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
没区别,互为别名的关系,连文档都是同一份:
http://www.ruby-doc.org/core/classes/Object.html#M000334 之所以还要有个 __send__ ,那是因为 send 是常用词,可能被覆盖,这时就可以用 __send__ 来调用 |
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
多谢各位大侠,这下明白了
|
|
| 返回顶楼 | |







