发新话题
打印

一条语句把所有实例方法变成类方法

一条语句把所有实例方法变成类方法

用extend可以把模块的实例方法变成接收者的类方法.那么extend self会出现什么结果?
啊哈,一条语句就把该模块所有实例方法变成该模块的类方法啦
 

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

 

TOP

发新话题