Хотя это вряд ли можно увидеть на практике, вы могли бы сделать это следующим образом.
module X
def self.x
:hi5
end
def self.v(str)
str.capitalize
end
def self.z(str)
yield(str)
end
def y
:ho
end
end
X.x
#=> :hi5
X.v("cat")
#=> "Cat"
X.z("cat") { |s| s.upcase }
#=> "CAT"
class Object
include X
X.methods(false).each do |m|
define_method(m) { |*args, &block|
X.method(m).call(*args, &block) }
end
end
#=> [:v, :x, :z]
Object.instance_methods && [:x, :v, :z, :y]
#=> [:x, :v, :z, :y]
o = Object.new
o.x
#=> :hi5
o.v("cat")
#=> "Cat"
o.z("cat") { |s| s.upcase }
#=> "CAT"
o.y
#=> :ho
Это также работает.
x #=> :hi5
v("cat")
#=> "Cat"
z("cat") { |s| s.upcase }
#=> "CAT"
y #=> "m"
Почему?Поскольку x
совпадает с self.x
(self #=> main
) и
self.is_a? Object
#=> true
Примечание
module X
def self.m
#...
end
end
является сокращением для
module X
class << self
def m
#...
end
end
end