您的位置:首页 > 编程语言 > Ruby

Alex学Ruby[详解 block和Proc对象]

2008-06-24 00:41 661 查看
Ruby block Part One:
本部分内容是基于Ruby 1. 8. 7

lambda方法:
例子1:
myBlock = lambda {|x| puts x} =>#<Proc:0x00008908@(irb):1>
myBlock.call("Ruby way")
=> Ruby way
puts myBlock.class
=> Proc
由此例子可以看出, lambda方法可以直接生成一个Proc对象。
例子2:
sub_lambda = lambda {|x,y| x - y}
=> #<Proc:0x0007ff44@(irb):4>
sub_lambda(2)
=>NoMethodError: undefined method `sub_lambda' for main:Object
sub_lambda.call(2)
=>ArgumentError: wrong number of arguments (1 for 2)
sub_lambda.call(2,3,4)
=>ArgumentError: wrong number of arguments (3 for 2)
sub_lambda.call(2,"3")
=>TypeError: String can't be coerced into Fixnum
sub_lambda.call(2,3)
=> -1
由此例可以看出,lambda生成的proc对象必须被call才可被调用。 而lambda方法会检查传入的参数个数,和参数类型。
例子3:
sub_procnew = Proc.new {|x,y| x-y}
=> #<Proc:0x00052238@(irb):12>
sub_procnew.call(4)
=>TypeError: nil can't be coerced into Fixnum
sub_procnew.call(4,3,5)
=> 1
sub_procnew.call(4,"3",5)
=>TypeError: String can't be coerced into Fixnum
sub_procnew.call(4,3,"5")
=> 1
由此例看出,Proc.new生成的对象不会去检查参数个数, 只是多退少补(nil), 但是会检查参数数据类型。
例子4:
def call_block_twice
yield
puts “going to call the block”
yield
puts “Going to call the block again”
end
call_block_twice {puts “This is a block”}

这个例子是两次调用块的例子。
我们可以重写这个方法:
def multiple_yield(n)
if block_given?
n.times { yield }
else
raise ArgumentError.new(“Block is required to call yield multip times”)
end
end
multiple_yield(2) { puts “I m a block”}
例子5,你也可以这么写:
def foo(&block)
block.call
end
foo {puts “Hi”}

本文出自 “悟道集” 博客,请务必保留此出处http://blackanger.blog.51cto.com/140924/83700
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: