2

我是 ruby​​ 新手,我正在阅读Progamming Ruby并遵循它的示例。

这是教的代码Inheritance and Messages

class Song
  def initialize(name, artist, duration)
    @name=name;
    @artist=artist;
    @duration=duration;
  end

  def to_s
    "Song:#@name \t#@artist\t#@duration"
  end
end

class KaraokeSong < Song
  def initialize(name, artist, duration, lyrics)
    super(name, artist, duration);
    @lyrics=lyrics;
  end

  def to_s
    super + "[#@lyrics]";
  end
end

song=KaraokeSong.new("There for me", "Sarah", 2320, "There for me, every time I've been away...")
puts song.to_s

此代码工作正常。

但是我发现如果我将to_sof更改为 this(注意和KaraokeSong之间没有空格):+"[#@lyrics]"

  def to_s
    super +"[#@lyrics]";
  end

我会得到错误:

to_s': undefined method+@' 中表示“[对我来说,每次我离开...]”:String (NoMethodError)

但后来我做了一个测试:

name="kk"
puts name +"sfds"

此代码不会引发任何错误。

有什么问题?

顺便说一句,我正在使用ruby 2.0.0p247 (2013-06-27) [x64-mingw32]

4

1 回答 1

1

您正在更改String. 以前,您正在有效地执行以下操作:

super.+(string)

现在,你正在这样做super(+string)。该+@方法未在 String 上定义(但它是在数字上定义的,并且只返回一个正数),这就是您看到此错误的原因。

于 2013-08-01T00:21:37.707 回答