gpt4 book ai didi

ruby - @foo、self.foo 和 foo 之间的区别?

转载 作者:数据小太阳 更新时间:2023-10-29 07:58:55 26 4
gpt4 key购买 nike

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 和 songs。

我很难理解为什么要使用这些,而不是对所有内容都使用@songs。

然后在这个例子中,

def add_song(song)
self.songs << song
song.artist = self
@@song_count +=1
end

为什么使用 self.songs 而不是 @songs?

好吧,我又忘了说一件事。在上面的第一个代码片段中,对于方法 print_songs,为什么我可以使用 songs.each 而不是 @songs.each?我预计它会生成错误未定义的歌曲。

最佳答案

Why is self.songs used instead of @songs

使用方法更加灵活。您正在抽象自己,不知道它究竟是如何获取/存储数据的。对实现细节的依赖越少,以后更改代码就越容易。

一个小例子,考虑songs

的这个实现
def songs
@songs ||= []
@songs
end

@songs 在调用此方法之前可能已被赋值,也可能未被赋值。但它不在乎。它确保 @songs 确实 有一个合理的默认值。这个概念称为“惰性初始化”,如果直接使用实例变量,这样做非常繁琐且容易出错。

所以,当有疑问时,总是使用方法。

关于ruby - @foo、self.foo 和 foo 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38612416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com