gpt4 book ai didi

ruby - 在 Ruby 的类范围内使用 @variable 是否正确?

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:39 25 4
gpt4 key购买 nike

我经常看到 ruby​​ 项目在 ruby​​ 类的类范围内使用实例变量 @var。

我认为在类方法中,应该使用类变量@@var,在实例方法中,应该使用实例变量@var。

我想知道在类范围内使用@var 是否是正确的方法?

目前我知道在类范围内使用实例变量和类变量的区别是实例变量不能被子类继承。代码演示了差异。

class Foo
@bar = 8
@@bar2 = 10
def self.echo_bar
p @bar
end

def self.echo_bar2
p @@bar2
end
end

class Foo2 < Foo

end

Foo.echo_bar
Foo.echo_bar2

Foo2.echo_bar
Foo2.echo_bar2
# Result:
# 8
# 10
# nil
# 10

最佳答案

Ruby 对象是:

  1. 数据 - 实例变量和关联值的映射。请注意,实例变量对实例本身是私有(private)的。
  2. 行为 - 指向类的指针,在该类中定义了此实例响应的方法。注意方法可以从父类继承。

类是 Ruby 中的一个对象。通过写作:

class Foo
@bar = 8
def self.get_bar
@bar
end
end

您将获得以下数据模型(不完全是,Foo 的祖先的层次结构及其特征类已被删除):

                             Class
|
Foo class ptr [eigenclass of Foo]
@bar = 8 ---------> method - get_bar

类范围内的实例变量定义该类对象的私有(private)数据。从上面的模型中,可以通过 Foo 的特征类及其祖先链 Class, Module, Object, Kernel, BasicObject 中定义的实例方法访问该实例变量。这些实例变量定义了一些与类对象 Foo 关联的数据。

通过写作:

class FooChild < Foo
end

你有

                             Class
|
Foo class ptr [eigenclass of Foo]
@bar = 8 ---------> method - get_bar
| |
FooChild class ptr [eigenclass of FooChild]
<Nothing> ---------> <Nothing>

类对象FooChild继承了Foo的特征类get_bar方法,所以可以调用FooChild.get_bar。但是,由于接收器是 FooChild,并且没有实例变量 @barFooChild 相关联,因此默认值 nil 将被退回。

以上分析在书Meta-programming Ruby中有更详细的分析.

类变量 (@@bar2),IMO 是一个具有奇怪解析顺序的作用域变量。通过在 Foo 的类作用域中引用 @@bar2,它将在 Foo 的祖先链中查找 @ 的定义@bar2从上到下。所以它将首先在 BasicObject 中查找,然后是 Kernel,然后是 Object,最后是 Foo

试一试下面的例子:

class Foo
@@bar = 1
def self.show
puts @@bar
end
end

Foo.show #=> 1

class Object
@@bar = "hahaha"
end

Foo.show #=> hahaha

关于ruby - 在 Ruby 的类范围内使用 @variable 是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23491681/

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