rubyer 2008-3-4 15:26
一条语句把所有实例方法变成类方法
用extend可以把模块的实例方法变成接收者的类方法.那么extend self会出现什么结果?
啊哈,一条语句就把该模块所有实例方法变成该模块的类方法啦[code]module PHP
def echo(*args)
print *args
end
extend self
end
PHP.echo 1,"2",3
include PHP
echo "456"[/code]PHP有成百上千个方法.
只需要在PHP模块里定义其对应的实例方法,然后extend self,那么ruby立刻就获得了另外一半的所有类方法.
这个例子也表明了ruby把DRY(don't repeat yourself)原则贯彻到了无以复加的地步,呵呵
mixin的用法是用include或者extend一个模块[code]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[/code][code]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[/code]