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

在这个基本的Crystal程序中:

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

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

  • 如果是这样,为什么我不能在任何地方找到它的定义?

  • 如果不是,谁是谁?

回答(2)

2 years ago

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

Crystal docs声称一切都是一个对象,但是当涉及到这些"top-level"方法时会有轻微的欺骗 .

与将"top-level"放入 Kernel 模块的Ruby不同,Crystal具有"Top Level Namespace"的概念,其中 putsgetsraise 等方法存在 .

它似乎没有与之关联的标识符,因此您无法检查/内省它以找出存在的内容 .

2 years ago

我知道这是一个有点老问题,但我刚开始玩Crystal .

在Ruby中,顶级对象称为 main ,是类 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 ,因为它只会告诉你那个名称没有本地变量或方法 .

我想主要的提示是"[Top Level Namespace]" 2 " lists no files in the " Defined In“部分的文档,该部分通常列出定义对象的类 .

简而言之,似乎Crystal开发人员选择保持最高级别无法访问,而不是object/class hybrid在Ruby中有点奇怪object/class hybrid .