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.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...