class Artist
@@song_count = []
attr_accessor :name, :songs
def initialize(name)
@name = name
@songs = []
end
def add_song(song)
@songs << song
end
def print_songs
songs.each {|song| puts song.name}
end
end
因此,在此示例中,它使用所有两种类型,即@歌曲和歌曲。
我很难理解为什么要使用它们,而不是对所有内容都使用@songs。
然后在这个例子中
def add_song(song)
self.songs << song
song.artist = self
@@song_count +=1
end
为什么使用self.songs代替@songs?
好,所以我忘了再说一件事。在上面的第一个代码段中,对于print_songs方法,为什么我可以使用songs.each而不是@ songs.each?我曾期望它会生成错误的未定义歌曲。
为什么使用self.songs代替@songs
使用该方法更加灵活。您正在从了解如何准确地获取/存储数据中抽象自己。您对实现细节的依赖越少,以后再更改代码就越容易。
一个小例子,考虑一下这种实现 songs
def songs
@songs ||= []
@songs
end
@songs
在调用此方法之前,可能已分配或未分配值。但这无关紧要。它确保@songs
确实具有合理的默认值。这个概念称为“延迟初始化”,如果直接使用实例变量,则非常繁琐且容易出错。
因此,如有疑问,请始终使用方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句