查看完整版本: 一条语句把所有实例方法变成类方法

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]
页: [1]
查看完整版本: 一条语句把所有实例方法变成类方法