rails3 与 rails4 中 try 方法的不同

rails最新版本中,在使用try调用私有方法的时候,有了一些差异

```ruby
class User
  include Mongoid::Document

  private
  def say
    puts "hello, world"
  end
end
```

rails3:
```ruby
  u = User.new
  u.try(:say)
  ==> hello, world
```

rails4:
```ruby
  u = User.new
  u.try(:say)
  ==> nil
```

测试,rails3中对象可以直接使用try调用私有方法,但是rails4中则不可以
我们来看看源代码

rails3.1 稳定版
```ruby
def try(*a, &b)
  if a.empty? && block_given?
    yield self
  else
    __send__(*a, &b)
  end
end
```

rails4.1 稳定版
```ruby
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则只能调用公有方法

 

------------------------------------------------------------------------------------------------------------------------------------

另外欢迎关注个人微信订阅号:ruby程序员, 方便大家坐车上下班无聊的时候,共同学习ruby & rails

-------------------------------------------------------------------------------------------------------------------------------------


rails3 与 rails4 中 try 方法的不同
 

你可能感兴趣的:(Rails,try)