Ruby的send和public_send方法有什么区别?

40

我很想知道 sendpublic_send 之间的区别。例如:

class Klass
  def hello(*args)
    "Hello " + args.join(' ')
  end
end

k = Klass.new
k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
k.public_send :hello, "gentle", "readers" #=> "Hello gentle readers"

2
要了解@Casper的意思,请将您的“hello”方法设置为私有并重试。 - Mischa
1个回答

67

与 send 不同,public_send 只调用公共方法。

来源

示例:

class Klass
  private
  def private_method
    puts "Hello"
  end
end

k = Klass.new
k.send(:private_method)
# => "Hello"

k.public_send(:private_method)
# => `public_send': private method `private_method' called for #<Klass:0x007f5fd7159a80> (NoMethodError)

您可能希望更喜欢使用#public_send而不是#send,以避免绕过私有/受保护的可见性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接