Mp *_*ega 17 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
Run Code Online (Sandbox Code Playgroud)
现在在......
@state_turns[state.id] -= 1 if @state_turns[state.id] > 0 && state.auto_removal_timing == 1
Run Code Online (Sandbox Code Playgroud)
它说错误
in 'block update_state_actions' : Undefined method '>' for nil:NilClass <NoMethodError>
Run Code Online (Sandbox Code Playgroud)
错误的原因是什么?怎么来>被认为是一种方法,但它是一个逻辑运算符?
Aru*_*hit 52
怎么来>被认为是一种方法,但它是一个逻辑运算符?
这没有问题.在Ruby中,当你写一个表达式一样1 + 2,在内部被理解为1.+( 2 ):调用方法#+在接收器上1用2作为单个参数.理解相同的另一种方法是,您将消息发送[ :+, 2 ]到对象1.
错误的原因是什么?
现在在你的情况下,由于某种原因@state_turns[ state.id ]返回nil.所以表达式@state_turns[state.id] > 0变成了nil > 0,正如我之前所说,它被理解为调用#>方法nil.但您可以检查属于NilClass哪个属性nil,没有#>定义实例方法:
NilClass.instance_methods.include? :> # => false
nil.respond_to? :> # => false
Run Code Online (Sandbox Code Playgroud)
NoMethodError因此,例外是合法的错误.通过提出这个错误,Ruby会保护你:它会提前告诉你,你@state_turns[ state.id ]不是你想象的那样.这样,您可以更早地纠正错误,并成为更有效的程序员.此外,可以使用begin ... rescue ... end语句挽救Ruby异常.Ruby异常通常是非常友好和有用的对象,您应该学习如何在软件项目中定义自定义异常.
为了进一步扩展这个讨论,让我们看看你的错误来自哪里.当你编写一个表达式nil > 10,实际上nil.>( 10 ),Ruby开始在#>查找链中搜索方法nil.您可以通过键入以下内容来查看查找链:
nil.singleton_class.ancestors #=> [NilClass, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
该方法将在祖先链的每个模块中进行搜索:首先,Ruby将检查是否#>定义NilClass,然后是Object,然后Kernel,最后,BasicObject.如果#>在其中任何一个中找不到,Ruby将继续尝试method_missing方法,再次按顺序查找链的所有模块.如果即使method_missing不处理该:>消息,NoMethodError也会引发异常.为了演示,让我们通过插入自定义消息来定义#method_missing方法,Object而不是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!
Run Code Online (Sandbox Code Playgroud)
为什么它不像NullPointerException那样
Ruby中没有这样的例外.查看Ruby的Exception课程.
| 归档时间: |
|
| 查看次数: |
74816 次 |
| 最近记录: |