对于以下代码块,我收到“NoMethodError: undefined method `%' for nil:NilClass”:
class Timer
attr_accessor :seconds
def initialize
@seconds = 0
end
def time_string
if seconds < 10
return "00:00:0" + seconds.to_s
elsif seconds < 60
return "00:00:" + seconds.to_s
elsif seconds < 540
minutes = seconds / 60
seconds %= 60
#seconds = seconds - (minutes * 60)
return "00:0" + minutes.to_s + ":0" + seconds.to_s
end
end
def timer
@timer
end
end
我知道“秒”是一个 Fixnum,因为当我尝试在没有 #to_s 的情况下 #puts 秒时,出现 NoMethod: Fixnum 错误。此外,前一行中“秒”上的“/”操作也可以正常工作。那么为什么我会收到 NoMethod:nilclass 错误消息?
为什么我会收到错误消息? “%”不应该在“/”可以的地方工作吗?
以下代码有效:
if seconds < 10
return "00:00:0" + seconds.to_s
elsif seconds < 60
return "00:00:" + seconds.to_s
elsif seconds < 540
minutes = @seconds / 60
seconds = @seconds % 60
return "00:0" + minutes.to_s + ":0" + seconds.to_s
end
这与实例变量有关,而我不理解实例变量。我很想知道 nil 是如何进入那里的。
最佳答案
这是调用 self
的方法、局部变量之间的交互,而 Ruby 在这些东西之间缺乏语法区别。
如果您将该行更改为:
self.seconds %= 60
然后就可以正常工作了。
问题在于,当 Ruby 看到对非限定名称的赋值时,它会创建一个具有该名称的局部变量,而不是查找访问器。
这是一个简单的演示:
irb(main):001:0> def foo=(n)
irb(main):002:1> puts "Calling foo!"
irb(main):003:1> @foo=n
irb(main):004:1> end #=> nil
irb(main):005:0> foo=1 #=> 1
irb(main):006:0> @foo #=> nil
irb(main):007:0> self.foo=2
Calling foo!
=> 2
irb(main):008:0> @foo #=> 2
关于ruby - 未定义方法 `%' 对于 nil :NilClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25538603/