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

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”}


你可能感兴趣的:(职场,Ruby,语法,休闲,Alex学Ruby)