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

标签 ruby nomethoderror fixnum

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

相关文章:

Python vs Groovy vs Ruby? (基于相关标准)

ruby - 如果 OpenStruct 中不存在键,我如何返回 nil?

ruby-on-rails - Ruby 中的 `try` 和 `&.`(安全导航运算符)有什么区别

optimization - 如何说服 Lisp SBCL 进行内联 fixnum 运算?

ruby - 打印 string.length 时出错

Ruby Integer 和 Fixnum 意外行为

ruby - 打印变量

ruby-on-rails - 与非类/模块错误相比

ruby - 更改 Rubinius Ruby 版本

ruby-on-rails - CartsController 中的 NoMethodError#destroy - 使用 Rails 4 进行敏捷 Web 开发