什么对象在我的 Crystal 程序中接收#puts?

What object receives #puts in my Crystal programs?

在这个基本的 Crystal 程序中:

class Greeter
  def greet(person)
    puts "Hello, #{person}!"
  end
end

谁是#puts的接收者?是self吗?

奇怪的是,答案是没有人!至少在 Ruby 意义上不是。

Crystal docs 声称一切皆对象,但在涉及这些 "top-level" 方法时有一点欺骗。

与 Ruby 不同,后者将所有 "top-level" 都放入 Kernel 模块中,Crystal 具有 "Top Level Namespace" 的概念,其中 puts, gets, raise, 等等直播。

它似乎没有与之关联的标识符,因此您无法inspect/introspect它来找出存在的内容。

我知道这是一个有点老的问题,但我才刚刚开始研究 Crystal。

在 Ruby 中,顶级对象称为 main,是 class Object 的一个实例,并混合在 Kernel 模块中。

self
#=> main
self.class
#=> Object
self.class.ancestors
#=> [Object, Kernel, BasicObject]

另一方面,Crystal 顶层似乎是文档中提到的“The Program”,但似乎无法以编程方式访问它:评估 self 在顶层给你错误 "there's no self in this scope"。出于同样的原因,您不能在没有显式接收者的情况下调用 inspect,因为它只会告诉您没有该名称的局部变量或方法。

我想主要的提示是“[顶级命名空间]”2”的文档在 "Defined In" 部分中没有列出任何文件,该部分通常列出 classes定义一个对象。

简而言之,Crystal 开发人员似乎选择让顶层无法访问,而不是 main 在 Ruby 中的有点奇怪的 object/class hybrid