Ruby 1.9概要(4) Block和Proc

    xiaoxiao2024-05-14  121

    1、 Proc加了新方法Proc#yield,这只是Proc#call的别名方法,是为了能让Proc也可以像block那样传入方法并且调用yield。 a_proc  =  Proc.new { | a,b |  a + b} a_proc. yield ( 1 , 2 #  => 3 def  test( & block)   block. yield ( 1 , 2 , 3 ) end test do  | a,b |    a + b    #  => 3 end test  & a_proc  #  =>3 2、 没有参数的block的基数(参数个数,arity): 1.8    lambda {}.arity   # => -1 1.9    lambda {}.arity  # => 0 所谓arity就是方法调用无法忽略的参数个数。这跟Erlang,Prolog中的arity的概念并无二致。 3、 proc关键字现在是Proc.new的同义词,proc在1.8的时候跟lambda关键字是同义词,也就是proc定义的是一个lambda而非字面 意义上的Proc,1.9改过来了。 1.9: proc{ | a,b | }.arity         #  => 2 proc{ | a,b | }.call( 1 )         #  => nil Proc.new{ | a,b | }.arity         #  => 2 Proc.new{ | a,b | }.call( 1 )         #  = nil 1.8: proc{ | a,b | }.arity         #  => 2 proc{ | a,b | }.call( 1 )         #  => ERROR: (eval):1: wrong number of arguments (1 for 2) Proc.new{ | a,b | }.arity         #  => 2 Proc.new{ | a,b | }.call( 1 )         #  => nil 1.8时候第二个调用出错的原因在于lambda在调用参数过多过少的时候都将报error,这是lambda跟Proc的一个区别之一。 4、 Proc#lambda? 用来判断某个Proc是否具有lambda语义或者block语义: lambda {}. lambda ?   # =>true proc{}. lambda #  =>false Proc.new{}. lambda #  =>false 文章转自庄周梦蝶  ,原文发布时间 2008-10-02
    最新回复(0)