微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 为什么Object ::如果发送到nil对象的话会尝试工作?

如果您尝试在 Ruby中的nil对象上调用方法,则会出现NoMethodError异常,并显示以下消息:

"undefined method ‘...’ for nil:NilClass"

但是,在Rails中有一个try方法,如果它被发送到一个nil对象,它只返回nil:

require 'rubygems'
require 'active_support/all'

nil.try(:nonexisting_method) # no NoMethodError exception anymore

那么如何在内部尝试工作以防止该异常呢?

解决方法

ActiveSupport 4.0.0定义了两种try方法one用于Object实例:

class Object
  def try(*a,&b)
    if a.empty? && block_given?
      yield self
    else
      public_send(*a,&b) if respond_to?(a.first)
    end
  end
end

other适用于NilClass实例(零个对象):

class NilClass
  def try(*args)
    nil
  end
end

现在,假设我们有一个Object实例(不包括nil,它实际上继承自Object,就像Ruby中的其他所有内容一样),定义一个返回nil的方法

class Test
  def returns_nil
    nil
  end
end

因此,运行Test.new.try(:returns_nil)或Test.new.not_existing_method,将调用Object#try,它将检查是否存在公共方法(respond_to?);如果是这样,它将调用方法(public_send),否则它将返回nil(没有其他行).

如果我们再次尝试这些返回的nil方法

Test.new.try(:returns_nil).try(:any_other_method)
Test.new.try(:not_existing_method).try(:any_other_method)

我们将调用NilClass#try,这是nil#try,它只是忽略所有内容并返回nil.因此,任何其他尝试都将在nil实例上调用并返回nil.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐