Ruby 未定义的方法'&燃气轮机';对于零:零级<;命名错误>;

Ruby 未定义的方法'&燃气轮机';对于零:零级<;命名错误>;,ruby,methods,operator-keyword,Ruby,Methods,Operator Keyword,好的,我有以下代码 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] >

好的,我有以下代码

 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>
“块更新状态动作”中的
:nil:NilClass的未定义方法“>”
错误的原因是什么为什么
>
被认为是一种方法,但它是一种逻辑运算符?

为什么>被认为是一种方法,但它是一种逻辑运算符

这没有问题。在Ruby中,当您编写类似于
1+2
的表达式时,在内部它被理解为
1.+(2)
:使用
2
作为单个参数在接收器
1
上调用方法
。另一种理解方法是,将消息
[:+,2]
发送到对象
1

错误的原因是什么

现在,在您的情况下,
@state\u出于某种原因打开[state.id]
返回
nil
。因此表达式
@state\u将[state.id]>0
变为
nil>0
,正如我前面所说,这被理解为在
nil
上调用
\code>方法。但是您可以检查
nil
所属的
NilClass
是否没有定义实例方法

NilClass.instance_methods.include? :> # => false
nil.respond_to? :> # => false
因此,
NoMethodError
异常是一个合法的错误。通过提出这个错误,Ruby保护了您:它很早就告诉您,您的
@state\u变成了[state.id]
并不是您想象的那样。这样,您就可以更早地纠正错误,成为一名更高效的程序员。另外,Ruby异常可以通过
begin。。。拯救。。。结束
语句。Ruby异常通常是非常友好和有用的对象,您应该学习如何在软件项目中定义自定义异常

为了进一步扩展这个讨论,让我们看看错误的来源。当您编写一个像
nil>10
这样的表达式时,实际上是
nil.>(10)
,Ruby开始在
nil
的查找链中搜索
#>
方法。您可以通过键入以下内容查看查找链:

    nil.singleton_class.ancestors #=> [NilClass, Object, Kernel, BasicObject]
将在祖先链的每个模块中搜索该方法:首先,Ruby将检查
#>
是否定义在
NilClass
上,然后是
对象
,然后是
内核
,最后是
基本对象
。如果在其中任何一个模块中都找不到
#>
,Ruby将继续尝试
method\u missing
方法,再次在查找链的所有模块上按顺序进行。如果即使
方法\u missing
也不能处理
:>
消息,则会引发
NoMethodError
异常。为了演示,让我们在
对象
中定义
#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!
为什么它不说像NullPointerException


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

必须将其转换为整数变量才能执行操作:

  • @state\u将[state.id]变为\u i>0
  • state_a=state.auto_removation_timing.to_i+1

使用括号时会发生什么情况,如
(@state\u turns[state.id]>0)和&(state.auto\u removation\u timing==1)
@state\u turns[state.id]
具有
nil
值。。。所以你需要做点别的。。由于
Nilclass#>
不存在..所以您出现了错误..我刚刚更新了stacktrace error@ArupRakshit,使其指向
,因为
@state\u将[state.id]
转换为
nil
?hmmm为什么它不说像
NullPointerException
hmmm你能进一步解释吗?谢谢你记住,这不是Java
nil
是类
NilClass
的对象
nil
确实有可以调用的方法,但是
不是其中之一。这就是为什么会出现
NoMethodError
。解释的第一段是:)