我有以下Ruby脚本,其中类Foo包含模块Baz,模块Baz有一个包含钩子,可以通过包含类(Foo)扩展Bar。我只是想知道为什么:
class << klass
extend Bar #this doesn't work. Why?
end
在以下情况下无效:
klass.extend(Bar) works.
这是我的代码:
#! /usr/bin/env ruby
module Baz
def inst_method
puts "dude"
end
module Bar
def cls_method
puts "Yo"
end
end
class << self
def included klass
# klass.extend(Bar) this works, but why the other approach below doesn't?
class << klass
extend Bar #this doesn't work. Why?
def hello
puts "hello"
end
end
end
end
end
class Foo
include Baz
end
foo = Foo.new
foo.inst_method
Foo.hello
Foo.cls_method
答案 0 :(得分:1)
在class << klass
的正文中,self
指的是klass
的单身类,而不是klass
本身,而在klass.extend(Bar)
中,接收者是{ {1}}本身。差异来自那里。
klass
由于您要将class A
end
class << A
p self # => #<Class:A> # This is the singleton class of A, not A itself.
end
p A # => A # This is A itself.
应用于extend
,因此在klass
的正文中执行此操作无效。
答案 1 :(得分:1)
你想要的是调用类对象(klass)上的extend
方法而不是单例类(类&lt;&lt; klass)。
因此,以下代码不起作用,因为您在单例类上调用extend
方法:
class << klass
extend Bar # doesn't work because self refers to the the singleton class of klass
def hello
puts "hello"
end
end