什么对象在我的Crystal程序中接收#puts?
问题描述:
在这个基本水晶程序:什么对象在我的Crystal程序中接收#puts?
class Greeter
def greet(person)
puts "Hello, #{person}!"
end
end
谁是#puts
接收器?是self
?
- 如果是这样,为什么我找不到任何地方的定义?
- 如果没有,是谁?
答
答案,奇怪的是,没人管!至少不在Ruby的意义上。
的Crystal docs使声称一切都是对象,但有轻微的欺骗,当谈到这些“*”的方法。
与红宝石,这使一切“*”到Kernel
模块,晶体具有"Top Level Namespace",其中的方法,如puts
,gets
,raise
等生活的概念。
它似乎并不具有与其相关联的标识,所以你不能检查/反思它,找出存在的。
答
我知道这是一个有点老问题,但我刚开始与水晶玩耍。
在Ruby中,*对象名为main
,是类Object
的一个实例,并混合在Kernel
模块中。
self
#=> main
self.class
#=> Object
self.class.ancestors
#=> [Object, Kernel, BasicObject]
在另一方面水晶*似乎是什么文件称之为“The Program”,但似乎没有办法以编程方式访问:在顶层评估self
为您提供了错误"there's no self in this scope"
。出于同样的原因,如果没有明确的接收方,您不能拨打inspect
,因为它只会告诉您没有该名称的本地变量或方法。
我猜主要的提示是,“[*命名空间]”的文件2“列表中没有文件‘中定义的’部分通常列出了定义对象的类。
简而言之,似乎水晶开发商选择保持*无法访问,而不是稍显怪异object/class hybrid即main
是红宝石。