演算子 - ruby=> 意味




Rubyのクラス<<自己イディオム (4)

Rubyでは、 class << selfは何をしますか?


どのようなクラス<<事は:

class Hi
  self #=> Hi
  class << self #same as 'class << Hi'
    self #=> #<Class:Hi>
    self == Hi.singleton_class #=> true
  end
end

[ self == thing.singleton_class をそのブロックのコンテキストで 作る ]

thing.singleton_classとは何ですか?

hi = String.new
def hi.a
end

hi.class.instance_methods.include? :a #=> false
hi.singleton_class.instance_methods.include? :a #=> true

hiオブジェクトは、その#methods#singleton_class.instance_methods #methodsから継承し、 #singleton_class.instance_methods #methodsから継承します。
ここでは、 hiシングルトンクラスインスタンスメソッドを提供しまし:a 。 それは、 クラス<< hiで済んでいた可能性があります。
hi#singleton_classはすべてのインスタンスメソッドhi#classがあり、さらにいくつかの( :a )があります。

[物の #class #singleton_class のインスタンスメソッドは、 直接thingに適用できます。 rubyがthing.aを見ると、まず、thing_class.instance_methodsのメソッド定義、次にthing.class.instance_methodsのメソッド定義が検索されます。

ところで、彼らはオブジェクトのシングルトンクラス == メタクラス == 固有 クラスを呼び出します。


シングルトンメソッドは、単一のオブジェクトに対してのみ定義されるメソッドです。

例:

class SomeClass
  class << self
    def test
    end
  end
end

test_obj = SomeClass.new

def test_obj.test_2
end

class << test_obj
  def test_3
  end
end

puts "Singleton's methods of SomeClass"
puts SomeClass.singleton_methods
puts '------------------------------------------'
puts "Singleton's methods of test_obj"
puts test_obj.singleton_methods

SingletonのSomeClassのメソッド

テスト

シングルトンのtest_objメソッド

test_2

test_3


まず、 class << foo構文はfooのシングルトンクラス(固有クラス)を開きます。 これにより、特定のオブジェクトに対して呼び出されたメソッドの動作を特化できます。

a = 'foo'
class << a
  def inspect
    '"bar"'
  end
end
a.inspect   # => "bar"

a = 'foo'   # new object, new singleton class
a.inspect   # => "foo"

今度は質問に答えるために: class << selfselfのシングルトンクラスをオープンするので、現在のselfオブジェクト(クラスまたはモジュール本体の内部はクラスまたはモジュール自身 )に対してメソッドを再定義することができます。 通常、これはクラス/モジュール(「静的」)メソッドを定義するために使用されます。

class String
  class << self
    def value_of obj
      obj.to_s
    end
  end
end

String.value_of 42   # => "42"

これは省略形として書くこともできます:

class String
  def self.value_of obj
    obj.to_s
  end
end

またはさらに短く:

def String.value_of obj
  obj.to_s
end

関数定義の中で、 selfは関数が呼び出されているオブジェクトを参照します。 この場合、 class << selfはそのオブジェクトのシングルトンクラスを開きます。 その1つの使用は、貧しい人の状態マシンを実装することです:

class StateMachineExample
  def process obj
    process_hook obj
  end

private
  def process_state_1 obj
    # ...
    class << self
      alias process_hook process_state_2
    end
  end

  def process_state_2 obj
    # ...
    class << self
      alias process_hook process_state_1
    end
  end

  # Set up initial state
  alias process_hook process_state_1
end

上記の例では、 StateMachineExample各インスタンスはprocess_hookエイリアスが付けられていますが、後者ではprocess_hookselfのみ、他のStateMachineExampleインスタンスに影響を与えない)をprocess_state_2再定義process_hook方法に注意してください。 したがって、呼び出し元がprocessメソッド(redefinable process_hookを呼び出す)を呼び出すたびに、その動作はどの状態にあるかによって変わります。


実際、RubyプロジェクトのC拡張を書く場合、実際にはModuleメソッドを定義する唯一の方法があります。

rb_define_singleton_method

私はこの自己事業があらゆる種類の他の質問を開くだけであることを知っているので、各部分を検索することでよりうまくやることができます。

最初にオブジェクト。

foo = Object.new

私はfooのためのメソッドを作ることはできますか?

確かに

def foo.hello
 'hello'
end

私はそれをどうしますか?

foo.hello
 ==>"hello"

もう一つのオブジェクト。

foo.methods

すべてのObjectメソッドと新しいメソッドを取得します。

def foo.self
 self
end

foo.self

ちょうどfooオブジェクト。

クラスとモジュールのような他のオブジェクトからfooを作成するとどうなるか見てみてください。 すべての回答の例は素晴らしいですが、コードが書かれている様子を実際に理解するためには、さまざまなアイデアやコンセプトを使用する必要があります。 だから、今見たいと思う言葉がたくさんあります。

Singleton、Class、Module、self、Object、Eigenclassが呼び出されましたが、RubyはObject Modelのように名前を付けません。 それはもっとMetaclassに似ています。 リチャードか__whyはここにあなたのアイデアを示しています。 viewsourcecode.org/why/hacking/seeingMetaclassesClearly.htmlそしてあなたが吹き飛ばされたら、検索でRuby Object Modelを調べてみてください。 私がYouTubeで知っている2つのビデオは、Dave ThomasとPeter Cooperです。 彼らはそのコンセプトについても説明しようとしています。 デイブはそれを得るのに長い時間を要したので、心配しないでください。 私はまだそれに取り組んでいます。 なぜ私はここにいるだろうか? あなたの質問をありがとう。 また、標準ライブラリを見てください。 それは、FYIと同様にシングルトンモジュールを持っています。

これはかなり良いです。 https://www.youtube.com/watch?v=i4uiyWA8eFk







singleton