Ruby 1.9概要(4) Block和Proc
程序员文章站
2022-03-11 09:37:34
...
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
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
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
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
proc{}. lambda ? # =>false
Proc.new{}. lambda ? # =>false
上一篇: 机器人判断人是否接近
下一篇: 使用ruby解析json