5

モジュールをクラスに混在させようとしていますが、一部のメソッドをクラス メソッドとして動作させ、他のメソッドをインスタンス メソッドとして動作させたいと考えています。

include ただし、両方と extendモジュールは必要ありません。私はむしろincludeそれをしたいです。

クラスメソッドにしたいメソッドをこの表記法でラップすると、次のように機能します。

class <<
  # ...
end

ただし、この表記法を使用すると機能しません。

class << self
  # ...
end

selfキーワードが、モジュールが混在するクラスではなく、モジュールへの明示的なバインディングを確立していると思われます。しかし、表記法selfを使用するときにキーワードをオフにしておくことを推奨するドキュメントは見たことがありません。class <<

これで何が起こっているのか誰か知っていますか?


更新:より明確にするためのサンプルコードを次に示します。

module M
  class <<
    def class_method
      puts "From inside the class_method"
    end
  end

  def instance_method
    puts "From inside the instance_method"
  end
end

class Object
  include M
end

class C
end


C.class_method

obj = C.new
obj.instance_method
4

2 に答える 2

6

class <<常にオブジェクトが続く必要があります。Justclass <<; endは構文エラーです。あなたの場合、次の理由で機能しているように見えます。

class <<
  def class_method
    puts "From inside the class_method"
  end
end

と同じです

class << def class_method
    puts "From inside the class_method"
  end
end

これはと同じです

temp = def class_method
  puts "From inside the class_method"
end
class << temp
end

これはと同じです

def class_method
  puts "From inside the class_method"
end
class << nil
end

これはと同じです

def class_method
  puts "From inside the class_method"
end

もちろん、実際にはクラス メソッドを定義していません。インスタンスメソッドを定義します。

于 2012-05-27T17:38:47.220 に答える
0

selfええ、モジュールでリアルを取得したい場合は、included コールバックを使用する必要があります。このような何かがあなたを正しい方向に向けます:

module Bar
  def self.included(base)
    class << base
      def class_method
        "class_method"
      end
    end
  end
end

class Foo
  include Bar
end


p Foo.class_method # => "class_method"
于 2012-05-27T17:03:17.883 に答える