3

これの違いがよくわかりません。

def String.hello  
  puts "hello there"   
end

x = Person.new    
def x.hello    
  puts "hello there"    
end

私の理解では、2 番目のコード ブロックはクラス Person のオブジェクトを作成します。def x.helloを実行すると、 xオブジェクトにメッセージを送信するときに最初にメソッドがチェックされる匿名クラス (シングルトン クラス) が作成されます。

これはdef String.helloの場合と同じですか? String はただのクラス Class のインスタンスですよね?def String.helloを実行すると、メソッドが String のクラス メソッドの 1 つとして追加されることを読みました。これは、インスタンス メソッドを取得するオブジェクトとそのクラスの間に作成される匿名クラスとは異なります。

上記のコードの両方のブロックで何が起こるでしょうか?

4

3 に答える 3

6

私はルビーのこの部分が大好きです。この美しい対称性があり、コア機能のほとんどが高度な機能に対する単なる砂糖であるため、概念を完全に理解すると、その理解を多くの言語に適用できます。

これはdefString.helloの場合と同じですか?文字列はクラスのインスタンスにすぎませんクラスは正しいですか?

はい、Classのインスタンスを作成し、それを定数に割り当てています。

def String.helloを実行すると、Stringのクラスメソッドの1つとしてメソッドが追加されることを読みました。これは、オブジェクトとそのインスタンスメソッドを取得するクラスの間にある匿名クラスが作成されるのとは異なります。

いいえ、不足している部分は、シングルトンクラスに追加せずにクラスレベルのメソッドを持つことが可能だと考えています。あなたが持っているのはClassのインスタンスであるオブジェクトであり、それとClassの間にある暗黙のクラスにメソッドを追加しています。この構文も時々見られます

class << self
  def method
  end
end

それは同じことをしているだけで、それについて非常に明確にしています。

于 2011-09-27T17:50:30.220 に答える
2

マットの答えに追加するだけです:

どちらの例も同じことを行いますが、別の方法で書きます。

String = Class.new # < done inside ruby initialization    
def String.hello    
  puts "hello there"    
end

x = Person.new    
def x.hello    
  puts "hello there"    
end

Ruby ではA = Class.new、構文 sugar を使用して作成されたクラス、class A; ...; endまたはすべてのオブジェクトに存在する Eigenclass にメソッドを追加できます。クラスメソッドは、実際には、クラスのインスタンスの Eigenclass のメソッドです。 の「自己」とは何かを考えてdef self.method; ...; endください。固有クラスは、次の構文で開くことができます。

x = Person.new
class << x
  # ...
end

Eigenclasses はクラスのインスタンスでもあるため (p self.class最後の例を追加してみてください)、Eigenclasses などもあります。紛らわしいと思われる場合は、それObjectがクラスでClassあり、オブジェクトであることを思い出してください。これが私がRubyを愛する理由です!

于 2011-09-27T18:07:43.810 に答える
0

次のコードは、「hello」メソッドをStringクラスに追加します。これにより、後続のすべての文字列に「hello」メソッドが追加されます。

def String.hello  
   puts "hello there"   
end

次のコードでは、Personクラスのインスタンスに「hello」メソッドを追加します。 x新しいPersonを作成する場合、そのオブジェクトには「hello」メソッドがありません。

x = Person.new    
def x.hello    
  puts "hello there"    
end

私が理解しているように、それが主な違いです。

これは役に立ちますか?

于 2011-09-27T17:50:17.940 に答える