在这个基本的 Crystal 程序中:
class Greeter
def greet(person)
puts "Hello, #{person}!"
end
end
谁是接收方#puts
?是self
吗?
- 如果是这样,为什么我在任何地方都找不到它的定义?
- 如果不是,那是谁?
在这个基本的 Crystal 程序中:
class Greeter
def greet(person)
puts "Hello, #{person}!"
end
end
谁是接收方#puts
?是self
吗?
奇怪的是,答案是没有人!至少不是 Ruby 意义上的。
Crystal 文档声称一切都是对象,但在涉及这些“顶级”方法时存在轻微的欺骗。
与 Ruby 将所有内容都放在Kernel
模块中的“顶级”不同,Crystal 具有“顶级命名空间”的概念,其中存在puts
、gets
、raise
等方法。
它似乎没有与之关联的标识符,因此您无法检查/反省它以找出存在的内容。
我知道这是一个有点老的问题,但我刚开始玩水晶。
在 Ruby 中,顶层对象被称为main
,是类的一个实例Object
并混合在Kernel
模块中。
self
#=> main
self.class
#=> Object
self.class.ancestors
#=> [Object, Kernel, BasicObject]
另一方面,Crystal 顶层似乎是文档所指的“程序”,但似乎无法以编程方式访问它:self
在顶层进行评估会给您错误"there's no self in this scope"
。出于同样的原因,您不能在inspect
没有显式接收器的情况下调用,因为它只会告诉您没有该名称的局部变量或方法。
我猜主要提示是“[Top Level Namespace]” 2的文档在“Defined In”部分中没有列出任何文件,该部分通常列出定义对象的类。
简而言之,Crystal 开发人员似乎选择保持顶层不可访问,而不是 Ruby 中稍微奇怪的对象/类混合。main