2014-04-21 54 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) 

它具有相同的輸出。

相關問題