Ruby ruby 的 Block,Proc,Lambda ---1

zputee · 2013年04月24日 · 最后由 iBachue 回复于 2013年04月24日 · 3109 次阅读

一、简介

  • 任何函数的调用,都可以传入 Proc 的对象。
  • 在任何函数中,添加一条语句(yield),就可以处理传入的:Proc 的对象
  • ruby 的块操作, 使用十分方便,无处不在。

二、例子(可在 irb 中运行)

class A
 #一般的函数调用时加入块,不处理而已,不会报错。
  def hi 
    'morning'
  end
  #方式1,任何函数只要加入一条语句,立刻具有处理块的能力,神奇吧
  def hi2
    yield if block_given     # 只要这一句
  end  
  #方式2,传入Proc 完全等价方式1, 繁琐,没有必要使用。
  def hi3(&block)     
    block.call if block      #注意 & 字符
  end  
  #方式3, 传入Proc对象是为了保存。
  def save_it(&block)
    @block = block if block  #存入实例变量@block中    
  end
  #续方式3, 保存Proc是为了以后调用。 
  def call_it
    @block.call if @block
  end
end

a = A.new
a.hi{|x| p x} #=>"morning"
a.hi2{p 'hi'} #=>"hi"
a.hi3{p 'hi'} #=>"hi"
a.save_it{p 'hi, proc'} #=>"#<Proc:...>"
a.call_it               #=>"hi,proc"
a.call_it               #=>"hi,proc"

block_given --> block_given?

最近怎么都和这个干上了。。。

#1 楼 @chenge 多谢,已改正

建议加个Block,Proc,Lambda节点..

现在这么多人都研究 Proc 啦。。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册