gpt4 book ai didi

ruby - 使用 class_eval 和 instance_eval 访问 Ruby 类变量

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

我有以下内容:

class Test
@@a = 10

def show_a()
puts "a: #{@@a}"
end

class << self
@@b = '40'

def show_b
puts "b: #{@@b}"
end
end
end

为什么以下工作:

Test.instance_eval{show_b}
b: 40
=> nil

但是我不能直接访问@@b

Test.instance_eval{ @@b }
NameError: uninitialized class variable @@b in Object

同样,下面的工作

t = Test.new
t.instance_eval{show_a}
a: 10
=> nil

但以下失败

t.instance_eval{ @@a }
NameError: uninitialized class variable @@a in Object

我不明白为什么我不能直接从 instance_eval block 访问类变量。

最佳答案

我刚刚在 RubyKaigi 派对上向 Matz 提出了同样的问题。我是半醉,他是清醒的,你可以以此为准。

Anton 是对的——您不能通过 instance_eval() 访问类变量的原因是“仅仅因为”。甚至 class_eval() 也有同样的问题(在我告诉他我已经尝试过之前,Matz 自己并不完全确定 class_eval() )。更具体地说:在范围方面,类变量更像是常量而不是实例变量,因此切换 self(如 instance_eval() 和 class_eval() 所做的)在访问它们时不会产生任何差异。

一般来说,完全避免类变量可能是个好主意。

关于ruby - 使用 class_eval 和 instance_eval 访问 Ruby 类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3434884/

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