class <<模块中的表示法

Nat*_*han 5 ruby module metaprogramming mixins

我正在尝试将一个模块混合到一个类中,我想要一些方法作为类方法,其他方法作为实例方法.

但是,我不想同时include extend模块.我宁愿include这么做.

当我用这种表示法包装我想成为类方法的方法时,它可以工作:

class <<
  # ...
end
Run Code Online (Sandbox Code Playgroud)

但是,当我使用这种表示法时,它不起作用:

class << self
  # ...
end
Run Code Online (Sandbox Code Playgroud)

我怀疑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
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 6

class <<必须始终跟一个对象.只是class <<; end语法错误.在你的情况下它看起来像是有效的,因为以下内容:

class <<
  def class_method
    puts "From inside the class_method"
  end
end
Run Code Online (Sandbox Code Playgroud)

是相同的

class << def class_method
    puts "From inside the class_method"
  end
end
Run Code Online (Sandbox Code Playgroud)

这是一样的

temp = def class_method
  puts "From inside the class_method"
end
class << temp
end
Run Code Online (Sandbox Code Playgroud)

这是一样的

def class_method
  puts "From inside the class_method"
end
class << nil
end
Run Code Online (Sandbox Code Playgroud)

这是一样的

def class_method
  puts "From inside the class_method"
end
Run Code Online (Sandbox Code Playgroud)

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