gpt4 book ai didi

元类中的 Ruby 类变量

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

我有一个像这样的 ruby​​ 类:

class C
@@v = 1

class << self
p @@v # everything goes well here
end
end

class << C
# here I get an exception
# `singletonclass': uninitialized class variable @@v in Object (NameError)
# from a.rb:5:in `<main>'

p @@v
end

我的问题是:异常显示“Object (NameError) 中未初始化的类变量 @@v”,但为什么 ruby​​ 查找 Object(main) 中的类变量?

似乎 ruby​​ 总是在它之外查找元类的类变量。

最佳答案

你已经定义了类变量@@v上课 C .我们不应该对此感到惊讶:

class << C
p @@v
end

引发异常,因为这里我们正在处理 singleton classC ,我们没有为其定义类变量 @@v .

真正的问题是,为什么这样做会奏效?

class C
@@v = 1

class << self
p @@v
end
end

答案似乎是,为了您的方便,无论何时您从该类内部访问该类的单例,Ruby 都会透明地让您访问该类的类变量。

请注意,无论您是否使用 class << self; def method_name,这在您定义方法时也始终有效。语法或 def self.method_name语法:

# assuming @@v in C is 1
class C
def self.print_v_from_inside
p @@v
end
end

def C.print_v_from_outside
p @@v
end

C.print_v_from_inside
# => 1

C.print_v_from_outside
# => NameError: uninitialized class variable @@v in Object

关于元类中的 Ruby 类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16391178/

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