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
类.