实例变量的直接读取

3
由于某些原因,以下代码可正常工作:

class Foo
  @foo = "foo"
end

Foo.new.@foo # => "foo"

我发现这个功能已经被用于标准库规范中,但似乎没有文档记录。所以问题是,这个功能的状态是什么,是否应该使用它?


1
我猜现在可以用这个,但是为什么呢?你不是可以一直使用 Foo.new.foo 吗? - SalmonKiller
1
对于 Foo.new.foo,您需要定义它。例如使用类似 getter: foo 的东西。这看起来更像是一个问题,我建议报告它。通常,如果您想保持代码兼容性,不应使用未记录的功能。它可能在标准库中一段时间,直到某些东西被修复并且已发布的库将依赖于适当的机制。 - ony
1个回答

2

目前,此功能仅用于内部目的,但正在讨论限制对实例变量的外部访问。类似于protected方法的行为可能很有用。

这个问题可以在crystal-lang/crystal#6066上找到。

一般情况下,我会避免使用此功能,因为它未经记录,而且很可能在某些时候被更改。


1
它还用于自动定义结构相等性。如果你想的话,基本上可以使用它,但不建议这样做。通常应该使用 getters。 - asterite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接