gpt4 book ai didi

ruby - 在类方法中使用实例变量 - Ruby

转载 作者:数据小太阳 更新时间:2023-10-29 06:21:00 24 4
gpt4 key购买 nike

我有一个类似下面的类,我使用实例变量(数组)来避免使用大量方法参数。

它按我的预期工作,但这是一个好的做法吗?实际上我不希望它起作用,但我猜想类方法在其他语言中不能像静态方法一样工作。

class DummyClass
def self.dummy_method1
@arr = []
# Play with that array
end

def self.dummy_method2
# use @arr for something else
end
end

最佳答案

Ruby 中实例变量作用于类的原因是 Ruby 类本身的实例(类 Class 的实例)。通过检查 DummyClass.class 亲自尝试一下。在 Ruby 中没有 C# 意义上的“静态方法”,因为每个方法都是在某个实例上定义(或继承到)并在某个实例上调用的。因此,他们可以访问被调用方恰好可用的任何实例变量。

因为 DummyClass 是一个实例,它可以有自己的实例变量就好了。只要您有对类的引用,您甚至可以访问这些实例变量(这应该总是因为类名是常量)。在任何时候,您都可以调用 ::DummyClass.instance_variable_get(:@arr) 并获取该实例变量的当前值。

至于是不是好事,要看方法

如果 @arr 在逻辑上是实例/类 DummyClass 的“状态”,则将其存储在实例变量中。如果 @arr 仅在 dummy_method2 中用作操作快捷方式,则将其作为参数传递。举一个使用实例变量方法的例子,考虑一下 Rails 中的 ActiveRecord。它允许您这样做:

u = User.new
u.name = "foobar"
u.save

在这里,分配给用户的名称是用户合法的数据。如果在 #save 调用之前,有人问“此时用户的名字是什么”,您会回答“foobar”。如果您深入研究内部结构(您将深入研究大量元编程,您会发现它们正是为此使用了实例变量)。

我使用的示例包含两个单独的公共(public)调用。要查看尽管只进行了一次调用但仍使用实例变量的情况,请查看 #update_attributes 的 ActiveRecord 实现。方法体只是load(attributes, false) && save。为什么 #save 没有传递任何参数(比如新的 name),即使它会在保存的正文中,比如 UPDATE users SET name='foobar' WHERE id=1;?这是因为名称之类的东西是属于实例的信息。

相反,我们可以看一下实例变量没有使用意义的情况。查看 #link_to_if 的实现,该方法接受 bool 型参数(通常是源代码中的表达式)以及通常被 #link_to 接受的参数,例如要链接到的 URL。当 bool 条件为真时,它需要将其余参数传递给 #link_to 并调用它。在此处分配实例变量没有多大意义,因为您不会说此处的调用上下文(渲染器)在实例中包含该信息。渲染器本身没有“链接到的 URL”,因此,它不应该埋在实例变量中。

关于ruby - 在类方法中使用实例变量 - Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9311347/

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