Ruby中比较特殊的是module和block.
module有命名空间的作用 可以将类,方法,和常数组织在一起
module还有mixin的方法,可以在class内部include一个module来实现混入一个module里的实例方法
sample:
block是一个代码块的意思,比如
{
...
}
do
...
end
都是代码块,可以在调用函数的时候不仅传入参数,并传入代码块,使用yield来调用,如:
代码块不仅可以匿名,也可以赋给一个handle,比如
一般情况下过程对象不使用Proc.new来创建,直接用proc来创建即可,如
其实代码块最好的应用的例子就是数组的each,collect,map等方法,都应用了匿名代码块。
(1..5).each{|i| puts "#{i}.hallo"}
过程对象的最简单例子
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"
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"}
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表达式更加灵活与强大。number.times{|n|
puts "#{n+1}.#{yield}"
}
end
h = Proc.new{
"hallo"
}
repeatePutLine(5){h.call}
一般情况下过程对象不使用Proc.new来创建,直接用proc来创建即可,如
def repeatePutLine(number)
number.times{|n|
puts "#{n+1}.#{yield}"
}
end
h = proc{
"hallo"
}
repeatePutLine(5){h.call}
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")
p.call("hello")