0

我从 Ruby 开始,在制作一些测试样本时,我偶然发现了代码中的一个错误,我不明白它为什么会发生。

该代码假装测试变量 finn 是否已定义?(),如果已定义,则将其递增。如果未定义,则将其定义为值 0(零)。当代码抛出错误时,我开始将它分解成小块并运行它,以更好地追踪错误的来源。代码在 IRB irb 0.9.5(05/04/13) 中运行,使用 ruby​​ 1.9.1p378

首先,我证明变量 finn 尚未定义,一切正常:

?> finn
NameError: undefined local variable or method `finn' for main:Object
        from (irb):134
        from /home/paulo/.rvm/rubies/ruby-1.9.1-p378/bin/irb:15:in `<main>'
>>

然后我证明以下内联条件按预期执行,一切正常:

?> ((defined?(finn)) ? (finn+1):(0))
=> 0

现在是引发错误的代码:

?> finn=((defined?(finn)) ? (finn+1):(0))
NoMethodError: undefined method `+' for nil:NilClass
        from (irb):143
        from /home/paulo/.rvm/rubies/ruby-1.9.1-p378/bin/irb:15:in `<main>'

我期望代码不会抛出任何错误,并且在执行变量 finn 后将定义为第一个值 0(零)。但是相反,代码抛出了错误,并且 finn 被定义但值为 nil。

>> finn
=> nil

错误可能来自哪里?!?为什么 inline-condition 单独工作,但在用于 finn 分配时不工作?

任何帮助表示赞赏:)

4

2 回答 2

3

在这一行中,

finn=((defined?(finn)) ? (finn+1):(0))

当您编写finn=时,它会声明 finn,并将其设置为 nil,直到赋值发生。因此,defined?(finn)返回true,因此它尝试执行finn+1,这相当于nil+1,这会导致您上面提到的 NoMethodError 。

您可能正在寻找这个:

finn ||= 0
finn += 1
于 2010-04-09T17:57:29.827 回答
1

约翰是对的。尝试:

finn = finn ? finn + 1 : 0
于 2010-04-09T17:58:34.527 回答