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
本部分内容是基于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
相关文章推荐
- Alex学Ruby[详解 block和Proc对象 2]
- 详解Ruby中的代码块对象Proc
- Ruby学习笔记-Block, Proc and Lambda
- Ruby中的block、proc、lambda区别总结
- 比较C#中的委托和Ruby中的block对象
- ruby 中的Block,lambda,Proc
- Ruby中使用Block、Proc、lambda实现闭包
- ruby中的可调用对象--proc和lamdba
- Ruby系列:玩转闭包(Block,Proc,lambda)
- Ruby 面向对象知识详解
- 玩转Ruby系列:玩转闭包(Block,Proc,lambda)
- 【ruby】详解proc与lambda的区别
- ruby 的代码块 proc/lambda/method/block
- ruby中的 Proc、block说明
- What Is the Difference Between a Block, a Proc, and a Lambda in Ruby
- Ruby 中的 block、proc、lambda
- ruby中Block, Proc 和 Lambda 浅析
- Ruby 之 Block, Proc, Lambda 联系--区别,转载
- ruby的Proc和代码块(Block)
- 用正则表达式看.NET编程--正则核心对象详解(三 )