论坛首页 Ruby版 ruby

请教一下 ruby __send__ 和 send 有什么区别

浏览 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__是什么意思,请哪位大侠给解释一下,多谢
   
最后更新时间:2008-01-18
__send__和send的功能是一样的.

不过这里有篇文章你可以看一下:

http://blog.brightredglow.com/2007/9/20/send-my-love-to-ruby-ii
   
0 请登录后投票
最后更新时间: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を使用してください"

不知道怎么解释
   
0 请登录后投票
最后更新时间: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)

   
0 请登录后投票
最后更新时间:2008-01-18
没区别,互为别名的关系,连文档都是同一份:
http://www.ruby-doc.org/core/classes/Object.html#M000334

之所以还要有个 __send__ ,那是因为 send 是常用词,可能被覆盖,这时就可以用 __send__ 来调用
   
0 请登录后投票
最后更新时间:2008-01-18
多谢各位大侠,这下明白了
   
0 请登录后投票
论坛首页 Ruby版 ruby

跳转论坛:
JavaEye推荐