首页 文章

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

提问于
浏览
3

在这个基本的Crystal程序中:

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

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

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

  • 如果不是,谁是谁?

2 回答

  • 4

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

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

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

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

  • 1

    我知道这是一个有点老问题,但我刚开始玩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 .

相关问题