加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:15:02 所属栏目:百科 来源:网络整理
导读:好的,我确实有以下代码 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
好的,我确实有以下代码
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类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读