この基本的な Crystal プログラムでは:
class Greeter
def greet(person)
puts "Hello, #{person}!"
end
end
の受信者は誰#puts
ですか? ですかself
?
- もしそうなら、どこにも定義が見つからないのはなぜですか?
- そうでない場合、誰ですか?
この基本的な Crystal プログラムでは:
class Greeter
def greet(person)
puts "Hello, #{person}!"
end
end
の受信者は誰#puts
ですか? ですかself
?
答えは、奇妙なことに、誰もいません!少なくとも Ruby の意味では。
Crystalのドキュメントでは、すべてがオブジェクトであると主張していますが、これらの「トップレベル」のメソッドに関しては、わずかなごまかしがあります。
すべてをモジュールに「トップレベル」で配置する Ruby とは異なり、Crystal には、、 、 などのメソッドが存在する「トップ レベルの名前空間」Kernel
という概念があります。puts
gets
raise
識別子が関連付けられていないように見えるため、検査/内省して何が存在するかを調べることはできません。
これはやや古い質問であることは知っていますが、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 " のドキュメントには、オブジェクトを定義するクラスを一般的にリストする「Defined In」セクションにファイルがリストされていないことだと思います。
要するに、Crystal の開発者は、Rubyにある少し奇妙なオブジェクト/クラスのハイブリッドではなく、最上位レベルにアクセスできないようにすることを選択したようです。main