gpt4 book ai didi

ruby - 了解在 Ruby 中初始化时分配的变量的访问

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:44 25 4
gpt4 key购买 nike

作为初学者,我不太了解self,所以我很难理解self.blogs 是如何初始化的,而 blogs 然后 self.blogsadd_blog 方法之后的下一行,都在下面的代码中一起工作。

为什么 add_blog 方法中的 blogs 访问与 initalize 中的 self.blogs 相同的变量?那么为什么之后要用self.blogs来对blogs数组进行排序呢?

此外,如果我在初始化中使用 @blogs 而不是 self.blogs 会有影响吗?

class User
attr_accessor :username, :blogs

def initialize(username)
self.username = username
self.blogs = []
end

def add_blog(date, text)
added_blog = Blog.new(date, self, text)
blogs << added_blog
self.blogs = blogs.sort_by { |blog| blog.date }.reverse
added_blog
end
end

最佳答案

要回答您的问题,我们必须揭示 attr_accessor 的真实性质.

class Foo
attr_accessor :bar
end

完全等同于

class Foo
def bar
@bar
end

def bar=(value)
@bar = value
end
end

你可以看到attr_accessor :bar定义两个实例方法 Foo#barFoo#bar=访问实例变量 @bar .

然后让我们看看您的代码。

self.blogs = []initialize实际上是在调用方法 User#blogs= , 并通过它设置实例变量 @blogs用一个空数组。可以写成self.blogs=([])但是很吵,不是吗?顺便说一下,你不能省略 self.否则它只是设置一个局部变量。

blogs << added_blog调用方法 User#blog返回 @blogs 的值.也可以写成self.blogs().push(added_blog) ,但它又不是 ruby 色的。您可以省略 self.因为没有名为 blogs 的局部变量在 User#add_blog , 所以 ruby​​ 回退 调用实例方法。

self.blogs = blogs.sort_by { |blog| blog.date }.reverse混合调用 User#blogs=User#blogs .

关于ruby - 了解在 Ruby 中初始化时分配的变量的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39358296/

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