欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ruby 1.9概要(4) Block和Proc

程序员文章站 2022-03-11 09:37:10
...

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



相关标签: Ruby Erlang