Ruby [新手的困惑] 复写了 ruby 内建的方法后子类有没有那个方法

Edward_jt · 2012年03月11日 · 最后由 hisea 回复于 2012年03月12日 · 3007 次阅读
class Song
  def initialize(name,artist,duration)
    @name    =name
    @artist  =artist
    @duration=duration
  end
end
song=Song.new("Bicycle",:"Fleck",260)
puts song.to_s                   #<Song:0x1c8ac8>
class Song
  def to_s
    "Song:#@name--#@artist(#@duration)"
  end
end
puts song.to_s                    #<Song:Bicycle--FLeck(260)>
class KaraokeSong<Song
  def initialize(name,artist,duration,lyrics)
    super(name,artist,duration)
    @lyrics=lyrics
  end
end
newsong=KaraokeSong.new("My Way","Sinatra",255,"And now,the...")
puts newsong.to_s               #<Song:My Way--Sinatra(255)>

只是想问最后一个输出为什么不是 KaraokeSong:0x86e4a58 还有弱弱的问局部变量有什么用。。为什么要变成实例变量

好吧。。我大概明白了

你最好附上代码 什么 27 页 Song 类的,什么根什么呀

局部变量 通常只能在 一个函数内使用。 这种问题,最好把代码传上来。

#3 楼 @ery 谢谢。 话说能不能举个例子(还是不大明白)

class Song
  def initialize(name,artist,duration)
  end
end
song=Song.new("Bicycle",:"Fleck",260)
puts song.to_s 
class Song
  def to_s
    "Song:#{name}--#{artist}(#{duration})"
  end
end
puts song.to_s 
class KaraokeSong<Song
  def initialize(name,artist,duration,lyrics)
    super(name,artist,duration)
  end
end
newsong=KaraokeSong.new("My Way","Sinatra",255,"And now,the...")
puts newsong.to_s 


我把代码改成这个样子后 然后报错 ‘rb:9:in to_s': undefined local variable or methodname' for #Song:0x9357bdc (NameError)”’ 这个错误是什么意思。。。是因为没把局部变量变成实例变量吗。?

#4 楼 @Edward_jt 因为你在方法定义的那个只是局部变量,只在定义的时候存在,出了方法那个 def end 就谁都不认识你里边的变量了。要使类中的方法都能用到的变量你要定义成实例变量,也就是@ 开头的那种。在初始化的时候赋 zhi 实例变量就 OK 了。

不同意楼上的观点

#5 楼 @xguox 这样子啊~现在明白了。谢谢~

#6 楼 @shawnyu 哪一点不妥呢?

就像 #3 楼 @ery 说的,局部变量 (不带@的) 通常只能在 一个方法内使用。方法结束,变量就消失了,另外一个方法访问的时候,即便名字一样,也是再访问另外一个变亮了。

实例变量(带@的)是跟着实例存在的,initialize 里面设置了,另外一个 实例方法 访问的时候,里面保存的值还在。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号