2013-05-28 43 views
8

Chỉ cần tự hỏi nếu có một phím tắt cú pháp đã dành hai procs và tham gia họ để đầu ra của một sẽ được chuyển cho người khác, tương đương với:Làm thế nào để kết hợp hai procs thành một?

a = ->(x) { x + 1 } 
b = ->(x) { x * 10 } 
c = ->(x) { b.(a.(x)) } 

Điều này sẽ có ích khi làm việc với những thứ như method(:abc).to_proc:xyz.to_proc

Trả lời

6

More đường, không thực sự khuyến khích trong mã sản xuất

class Proc 
    def *(other) 
    ->(*args) { self[*other[*args]] } 
    end 
end 

a = ->(x){x+1} 
b = ->(x){x*10} 
c = b*a 
c.call(1) #=> 20 
+0

Rất đẹp! Tại sao bạn không giới thiệu nó? – Gunchars

+0

Mở lại các lớp dựng sẵn (như Proc), luôn nguy hiểm do các thư viện khác có thể làm tương tự, hoặc các thay đổi trong tương lai đối với Ruby. –

+2

Tôi ngạc nhiên rằng nó không nằm trong thư viện chuẩn ở đâu đó. Có vẻ như một điều khá hữu ích. – Gunchars

2
a = Proc.new { |x| x + 1 } 
b = Proc.new { |x| x * 10 } 
c = Proc.new { |x| b.call(a.call(x)) } 
+0

Nhu cầu đường nhiều hơn nữa! – Gunchars

+0

Vui lòng giải thích thiếu đường nào trong câu trả lời này? –

+0

Xin lỗi nếu tôi không rõ ràng: bạn được cung cấp 'a' và' b'. Bạn cần lấy 'c'. Tất nhiên bạn có thể viết một proc mới, nhưng tôi tự hỏi nếu có một cách ngắn hơn, như 'b.wrap a' hay cái gì đó. – Gunchars

2

bạn có thể tạo ra một hoạt động công đoàn như vậy

class Proc 
    def union p 
     proc {p.call(self.call)} 
    end 
end 
def bind v 
    proc { v} 
end 

sau đó bạn có thể sử dụng nó như thế này

a = -> (x) { x + 1 } 
b = -> (x) { x * 10 } 
c = -> (x) {bind(x).union(a).union(b).call} 
Các vấn đề liên quan