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你能进一步解释吗?谢谢你记住,这不是Javanil
是类NilClass
的对象nil
确实有可以调用的方法,但是
不是其中之一。这就是为什么会出现NoMethodError
。解释的第一段是:)