ruby – 未定义的方法’>’为nil:NilClass

好的,我确实有以下代码
def update_state_actions
    states.each do |state|
      @state_turns[state.id] -= 1 if @state_turns[state.id] > 0 && state.auto_removal_timing == 1
    end
  end

现在在…的行

@state_turns[state.id] -= 1 if @state_turns[state.id] > 0 && state.auto_removal_timing == 1

它说错误

in 'block update_state_actions' : Undefined method '>' for nil:NilClass <NoMethodError>

错误的原因是什么?怎么来>被认为是一种方法,但它是一个逻辑运算符?

解决方法

how come > is considered as a method but it is a logical operator?

没有问题.在Ruby中,当你写一个像1 2这样的表达式时,它在内部被理解为1.(2):在接收器1上调用方法#,其中2为单个参数.理解相同的另一种方法是,您将消息[:,2]发送到对象1.

what is the cause of the error?

现在在你的情况下,@state_turns [state.id]由于某种原因返回nil.所以表达式@state_turns [state.id]> 0变为零> 0,正如我之前所说,这被理解为呼叫#>方法为零.但是,您可以检查NilClass,其中nil属于,没有实例方法#>定义在:

NilClass.instance_methods.include? :> # => false
nil.respond_to? :> # => false

因此NoMethodError异常是一个合法的错误.通过提高这个错误,Ruby保护你:它早日告诉你@state_turns [state.id]不是你假定的.这样,您可以更早地纠正错误,并成为更有效的程序员.此外,Ruby异常可以通过begin … rescue … end语句来获取. Ruby异常通常是非常友好和有用的对象,您应该学习如何在软件项目中定义自定义异常.

为了进一步扩展这个讨论,我们来看看你的错误来自哪里.当你写一个如nil> 10,实际上是零.>(10),Ruby开始搜索#>查找链中的方法为零.您可以键入以下内容查看查找链:

nil.singleton_class.ancestors #=> [NilClass,Object,Kernel,BasicObject]

将在祖先链的每个模块中搜索方法:首先,Ruby将检查#>在NilClass上定义,然后在Object上,然后是Kernel,最后是BasicObject.如果#>在任何一个都没有找到,Ruby将继续尝试method_missing方法,再次按照查找链的所有模块.如果即使method_missing没有处理:>消息,将会引发NoMethodError异常.为了演示,让我们通过插入一个自定义消息来定义Object中的#method_missing方法,而不是NoMethodError:

class Object
  def method_missing( name,*args )
    puts "There is no method '##{name}' defined on #{self.class},you dummy!"
  end
end

[ 1,2,3 ][ 3 ] > 2 
#=> There is no method '#>' defined on NilClass,you dummy!

Why doesn’t it says like NullPointerException

Ruby中没有这样的例外.检查Ruby的Exception类.

相关文章

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