什么对象在我的 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。
在这个基本的 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。