Ruby类名称被大写的真正原因是什么?

时间:2010-01-03 04:31:04

标签: ruby class identifier

好的,所以每个人都知道大写标识符在Ruby中被视为“常量”。

但是,可以为常量指定一个新值,因此以下工作

class A
  def self.hi; "hi"; end
end
class B
  def self.hi; "ho"; end
end
A.hi # => "hi"
B.hi # => "ho"
A = B
#  warning: already initialized constant A
# => B
A.hi # => "ho"

并且还分配给小写标识符工作:

a = B
a.hi # => "ho"

但是,在所有情况下,内部名称都设置为“B”,新标识符名称也仅引用“B”。

但是,如果标识符在技术上可以使用小写名称,为什么对类的内部名称有这个限制?它不能是必须恒定的,因为它不是恒定的;所以另一个原因可能是小写标识符具有不同的范围。但那么:为什么没有一个小写范围的类?

我很想知道,因为解析器甚至允许在unicode等方法中使用方法名称,因此对于类来说它更受限制似乎很奇怪。

2 个答案:

答案 0 :(得分:1)

正如你所说,类的名称是它被赋予的第一个常量的名称。您只能使用class关键字的常量,因为已经确定class关键字只应用于创建命名类。

理由可能是允许局部变量会混淆用户,谁会使用class lowercase_class_name,不知道小写和大写标识符之间的区别,然后想知道为什么类名在任何地方都不可见(即为什么{{ 1}}没用。)

通过创建特定于常量的类的默认方式,以这种方式定义的类将在任何地方都可见,并且至少有一个建议,即与该名称关联的值不应更改(即,否则会收到警告)。 / p>

如果他们需要,知道他们正在做什么的人仍然可以def foo() lowercase_class_name.new end

答案 1 :(得分:-1)

解释器需要一种方法来确定它是类名还是当前类/模块的成员变量。

解释器必须在全局哈希表中查找类名,而成员变量在类哈希表中。局部变量是不同的,因为解释器可以解析它们而根本不查找哈希表(它们优先于成员变量)。

解释器唯一知道标识符的是字符。因此存在符号差异。这也是全局变量具有前面的$和类变量@字符的原因。为此,解释器具有必须搜索的其他哈希表。

其他脚本语言也有类似的限制,例如PHP需要在每个变量前面加一美元。