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

zputee · 2013年04月26日 · 2328 次阅读

一、代码块不是对象。

#{p "hi"} 是代码块
#代码块不是对象。
 {p 'hi'}.class
#=>SyntaxError: unexpected '}', expecting $end

#所以代码块不能调用方法call
{p 'hi'}.call
#=>{p 'hi'}.call
#        ^

二、 &proc 只存在于方法和方法调用的参数中,但不是一般的参数。(&proc 像 Proc 类的对象的指针,可以这么理解,&proc 不是对象)

def m
  yield
end
pp = lambda{ p "hi, world"}
m(&pp)        #<---- &pp 方法调用的参数中, 但不是一般的参数。
#=>"hi, world"

pp            #是Proc的对象
"#<Proc: (lambda)>"
&pp            #不是对象
#=>SyntaxError: unexpected tAMPER, expecting $end


三、Proc 类的对象与 Method 类的对象很像,可带调用参数,它们可以相互转换。 http://ruby-china.org/topics/10470

def m
end
pp = lambda{p "hi, world"}
method(:m).class
#=>Method
pp.class
#=>Proc
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号