2012-11-05 24 views
5

Về currying trong Ruby 1.9.x, tôi đã sử dụng nó ở một số nơi, và có thể được dịch như về cơ bản hỗ trợ các thông số mặc định để các đối số proc:Ruby Reverse Currying: Điều này có khả thi không?

p = proc {|x, y, z|x + y + z} 
p.curry[1] #=> returns a lambda 
p.curry[1, 2] #=> returns a lambda 
p.curry[1, 2, 3] #=> 6 
p2 = p.curry[1, 2] 
p2.(2) #=> 5 
p2.(4) #=> 7 

rất tiện dụng, phải không? là, tôi muốn để có thể cà ri ngược lại, có nghĩa là, điền vào các đối số cuối cùng của proc của tôi với một giá trị ngẫu nhiên. Như thế này:

p = proc{|x, y| x - y }.curry[1] 
p.(4) 

kết quả mong muốn của tôi sẽ là 3. this returns -3.

Trả lời

1

tôi nghĩ rằng không có cách nào trực tiếp làm điều đó và những gì bạn đang làm là một chút tinh ranh, có lẽ là giải pháp tốt hơn cho vấn đề của bạn hơn back-tách lạng bộ

những gì bạn có thể làm để đạt được kết quả mong muốn là bọc hơn procs xung quanh procs của bạn:

p = proc{|x, y| x - y} 
q = proc{|y, x| p[x, y]} 
q.curry[1].(4) 

trong thực tế, bạn có thể sắp xếp lại các đối số bất kỳ cách nào bạn muốn nhưng tôi tin rằng nó bị lộn xộn rất nhanh chóng

+0

humm, trông sạch đủ, sẽ cung cấp cho nó một thử. Trường hợp sử dụng là sao chép ở một nơi nhất định mà bạn nhận được từ các đối số mặc định trên các phương thức, và chúng chỉ có thể được thiết lập từ đối số cuối cùng về sau. Tôi muốn sử dụng cùng một phương thức và thay thế đối số mặc định bằng một giá trị khác trong ngữ cảnh khác. – ChuckE

Các vấn đề liên quan