2014-04-21 51 views
2

如何可以产生两个diferent块中相同的方法如何产生2块在1方法

示例代码:

def by_two(n,a) 
    yield n 
    yield a 
end 

proc1 = proc {|x| p x * 2} 
proc2 = proc {|x| x + 100} 

by_two(10, 300, &proc1, &proc2) 

误差是这样 -

main.rb:7: syntax error, unexpected ',', expecting ')' 
by_two(10, 300, &proc1, &proc2) 

不限建议在哪里和哪里出错?谢谢

回答

8

块是一种将单个匿名过程传递给方法的轻量级方法。所以,的定义,不能有两个传递给方法的块。这不仅仅是语义上不可能的,它甚至不可能在语法上

红宝石确实支持一流的程序的Proc S中的形式,但是,因为这些都只是对象就像任何其他对象,你可以通过尽可能多的人,只要你想:

def by_two(n, a, proc1, proc2) 
    proc1.(n) 
    proc2.(a) 
end 

proc1 = proc {|x| p x * 2} 
proc2 = proc {|x| x + 100} 

by_two(10, 300, proc1, proc2) 
# 20 
# => 400 

由于Ruby 1.9中引入的λ文字的,Proc s为几乎语法轻量级块,所以没有很大的区别了:

by_two(10, 300, -> x { p x * 2 }, -> x { x + 100 }) 
# 20 
# => 400 
9

你不能在一个方法中产生两个块。

但是你可以带两个特效。

def by_two(n, a, pr1, pr2) 
    pr1.call(n) 
    pr2.call(a) 
end 
by_two(10, 300, proc1, proc2) 
4

你的问题的答案是:你不能这样做,如果你坚持块! Ruby不支持每个方法多个块。去解决的办法是通过两项特效像这样的变量:

def by_two(n,a, proc1=nil, proc2=nil) 
    if proc1 || proc2 
    proc1.yield n if proc1 
    puts proc2.yield a if proc2 
    else 
    puts "no procs" 
    end 
end 

proc1 = proc {|x| p x * 2} 
proc2 = proc {|x| x + 100} 
by_two(10, 300, proc1, proc2) 

by_two(10, 300, proc1) 

by_two(10, 300) 

输出:

20 
400 
20 
no procs 

另一种可能性是:

NO_OP = proc {} 

def by_two(n,a, proc1=NO_OP, proc2=NO_OP) 
    if proc1 == NO_OP && proc2 == NO_OP 
    puts "no procs" 
    else 
    proc1.yield n 
    proc2.yield a 
    end 
end 

proc1 = proc {|x| p x * 2} 
proc2 = proc {|x| p x + 100} 
by_two(10, 300, proc1, proc2) 

by_two(10, 300, proc1) 

by_two(10, 300) 

它具有相同的输出。

相关问题