3

この基本的な Crystal プログラムでは:

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

の受信者は誰#putsですか? ですかself

  • もしそうなら、どこにも定義が見つからないのはなぜですか?
  • そうでない場合、誰ですか?
4

2 に答える 2

4

答えは、奇妙なことに、誰もいません!少なくとも Ruby の意味では。

Crystalのドキュメントでは、すべてがオブジェクトであると主張していますが、これらの「トップレベル」のメソッドに関しては、わずかなごまかしがあります。

すべてをモジュールに「トップレベル」で配置する Ruby とは異なり、Crystal には、、 、 などのメソッドが存在する「トップ レベルの名前空間」Kernelという概念があります。putsgetsraise

識別子が関連付けられていないように見えるため、検査/内省して何が存在するかを調べることはできません。

于 2016-10-03T22:51:55.990 に答える
1

これはやや古い質問であることは知っていますが、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

于 2016-10-22T03:34:21.687 に答える