gpt4 book ai didi

ruby - 未定义方法 `%' 为 nil :NilClass

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:46 25 4
gpt4 key购买 nike

对于以下代码块,我收到“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

我知道 'seconds' 是一个 Fixnum,因为当我尝试在没有 #to_s 的情况下 #puts seconds 时出现 NoMethod: Fixnum 错误。此外,前一行中“seconds”的“/”操作工作正常。那么,为什么我会收到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com