李超

cc编程笔记本。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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

= 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

= proc{
    
"hallo"
}

repeatePutLine(
5){h.call}

其实代码块最好的应用的例子就是数组的each,collect,map等方法,都应用了匿名代码块。
(1..5).each{|i| puts "#{i}.hallo"}

过程对象的最简单例子
= proc{|arg| puts arg} 

p.call(
"hello")

posted on 2008-01-16 16:47  coderlee  阅读(426)  评论(0编辑  收藏  举报