3

在这个基本的 Crystal 程序中:

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

谁是接收方#puts?是self吗?

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

2 回答 2

4

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

Crystal 文档声称一切都是对象,但在涉及这些“顶级”方法时存在轻微的欺骗。

与 Ruby 将所有内容都放在Kernel模块中的“顶级”不同,Crystal 具有“顶级命名空间”的概念,其中存在putsgetsraise等方法。

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

于 2016-10-03T22:51:55.990 回答
1

我知道这是一个有点老的问题,但我刚开始玩水晶。

在 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

于 2016-10-22T03:34:21.687 回答