为了账号安全,请及时绑定邮箱和手机立即绑定

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

2019.01.21 18:47 885浏览


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休闲


点击查看更多内容
0人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消