Rails 最新版本中,在使用 try 调用私有方法的时候,有了一些差异
class User
include Mongoid::Document
private
def say
puts "hello, world"
end
end
Rails 3:
u = User.new
u.try(:say)
==> hello, world
rails4:
u = User.new
u.try(:say)
==> nil
测试,Rails 3 中对象可以直接使用 try 调用私有方法,但是 Rails 4 中则不可以
我们来看看源代码
Rails 3.1 稳定版
def try(*a, &b)
if a.empty? && block_given?
yield self
else
__send__(*a, &b)
end
end
Rails 4.1 稳定版
def try(*a, &b)
if a.empty? && block_given?
yield self
else
public_send(*a, &b) if respond_to?(a.first)
end
end
主要差异在于 send 和 public_send, 如果你是个老手,肯定知道怎么回事了
send 是 Ruby 的内核方法,可以调用任意方法
public_send 则只能调用公有方法