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”}
©著作权归作者所有:来自51CTO博客作者blackanger的原创作品,如需转载,请注明出处,否则将追究法律责任
职场Ruby休闲
共同学习,写下你的评论
评论加载中...
作者其他优质文章