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

问题描述:

在这个基本水晶程序:什么对象在我的Crystal程序中接收#puts?

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

谁是#puts接收器?是self

  • 如果是这样,为什么我找不到任何地方的定义?
  • 如果没有,是谁?

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

Crystal docs使声称一切都是对象,但有轻微的欺骗,当谈到这些“*”的方法。

与红宝石,这使一切“*”到Kernel模块,晶体具有"Top Level Namespace",其中的方法,如putsgetsraise等生活的概念。

它似乎并不具有与其相关联的标识,所以你不能检查/反思它,找出存在的。

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

在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 hybridmain是红宝石。