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 <<必须始终跟一个对象。只是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

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

于 2012-05-27T17:38:47.220 回答
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"
于 2012-05-27T17:03:17.883 回答