Ruby中比較特殊的是module和block.
module有命名空間的作用 可以將類,方法,和常數組織在一起
module還有mixin的方法,可以在class內部include一個module來實現混入一個module裡的執行個體方法
sample:module MSample
PI = 1
def self.say
puts "static hi"
end
def say
puts "instance hi"
end
class Inner
include MSample #mixin module MSample
end
end
class Sample
include MSample #mixin module MSample
end
MSample::PI = 5
puts MSample::PI.to_s # put "5"
MSample.say # put "static hi"
puts MSample.class # put "Module"
(Sample.new).say # put "instance hi"
(MSample::Inner.new).say # put "instance hi"
block是一個代碼塊的意思,比如
{
...
}
do
...
end
都是代碼塊,可以在調用函數的時候不僅傳入參數,並傳入代碼塊,使用yield來調用,如:def repeatePutLine(number)
number.times{|n|
puts "#{n+1}.#{yield}"
}
end
repeatePutLine(5){"hallo"}
代碼塊不僅可以匿名,也可以賦給一個handle,比如def repeatePutLine(number)
number.times{|n|
puts "#{n+1}.#{yield}"
}
end
h = Proc.new{
"hallo"
}
repeatePutLine(5){h.call}
上面的h在ruby中被稱為一個過程對象,可以被視為一個代碼塊的handle,在調用過程對象裡的代碼時,呼叫該過程對象的call方法即可,過程對象相當於其他語言的lambda運算式,但是比lambda運算式更加靈活與強大。
一般情況下過程對象不使用Proc.new來建立,直接用proc來建立即可,如def repeatePutLine(number)
number.times{|n|
puts "#{n+1}.#{yield}"
}
end
h = proc{
"hallo"
}
repeatePutLine(5){h.call}
其實代碼塊最好的應用的例子就是數組的each,collect,map等方法,都應用了匿名代碼塊。
(1..5).each{|i| puts "#{i}.hallo"}
過程對象的最簡單例子p = proc{|arg| puts arg}
p.call("hello")