module PHP
def echo(*args)
print *args
end
extend self
end
PHP.echo 1,"2",3
include PHP
echo "456"
PHP有成百上千个方法.
只需要在PHP模块里定义其对应的实例方法,然后extend self,那么ruby立刻就获得了另外一半的所有类方法.
这个例子也表明了ruby把DRY(don't repeat yourself)原则贯彻到了无以复加的地步,呵呵
mixin的用法是用include或者extend一个模块
module Dotnet
def vb
puts "vb"
end
def csharp
end
end
class Ruby
include Dotnet #include 获得实例方法
extend Dotnet #extend获得类方法
end
Ruby.new.vb #实例方法获得vb
Ruby.vb #作为ruby类方法的vb,不用new
module Dotnet
def vb
puts "vb"
end
def csharp
end
def Dotnet.version
puts "asp.net 2.0"
end
end
#Dotnet.new.vb 是不行的,因为Dotnet是模块,不允许实例化
Dotnet.version #version是Dotnet的模块(类)方法,不需要实例化就可以调用
#我们其实希望vb和csharp都作为模块(类)方法,而又不想重新依次定义.所以
module Dotnet
extend self
end
puts "extend self后vb这个实例方法成为了Dotnet的模块方法(它自己扩展了自己)"
Dotnet.vb