【问题标题】:Ruby class methodsRuby 类方法
【发布时间】:2021-09-05 10:52:10
【问题描述】:

有人可以帮我解决这个问题吗? 我尝试了这段代码,但我不断收到底部所示的方法错误

 class Song
    @@play = 0;  #class variable must be define before use
    
    def initialize(name, artist, duration)
        @name = name
        @artist = artist
        @duration = duration
        @plays = 0
    end

    def play
        @plays += 1 #same as @plays = @plays + 1
        @@play += 1
        "This song: #@plays plays. Total #@@play plays"
    end

end

class SongList
    Max_Time = 5*60

    def self.is_too_long(song)
        return song.duration > Max_Time
    end
end

song1 = Song.new("Bicyclops", "Fleck", 260)
p song1.duration

p SongList.is_too_long(song1)

ruby_ex03.rb:49:in <main>': undefined method duration' for #Song:0x000000000605f338 (NoMethodError)

【问题讨论】:

  • Song 没有方法“duration”,实例变量就是这样——不是访问器方法。

标签: ruby oop


【解决方案1】:

在 Ruby 中,实例变量和方法是不同的东西,没有办法*从它们所属的类之外访问实例变量。如果你想让你的实例变量可以访问,你需要在你的类中定义访问器

def duration
  @duration
end

幸运的是,这种模式非常普遍,Ruby 为我们提供了一条捷径。只需将其放在您的班级正文中

attr_reader :duration

*从技术上讲,我们可以使用反射从任何地方访问实例变量,但从概念上讲,您应该认为它们是不可访问的。这些技术是先进的,仅在特殊情况下才有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2015-04-04
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多