class<<模块中的符号

时间:2012-05-27 16:30:50

标签: ruby module metaprogramming mixins

我正在尝试将模块混合到一个类中,我希望某些方法可以作为类方法运行,而其他方法则是实例方法。

但是,我不想同时使用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

2 个答案:

答案 0 :(得分:6)

class <<必须始终跟一个对象。仅class <<; 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

当然,这并没有实际定义一个类方法。它定义了一个实例方法。

答案 1 :(得分:0)

是的,如果您想在模块中获得真实self,请使用included callback。这样的事情指向了正确的方向:

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"