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> 错误的原因是什么?怎么来>被认为是一种方法,但它是一个逻辑运算符? 解决方法
没有问题.在Ruby中,当你写一个像1 2这样的表达式时,它在内部被理解为1.(2):在接收器1上调用方法#,其中2为单个参数.理解相同的另一种方法是,您将消息[:,2]发送到对象1.
现在在你的情况下,@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!
Ruby中没有这样的例外.检查Ruby的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |