2012-12-18 33 views
5

Tôi đang cố gắng để tìm hiểu Ruby ngay bây giờ sau khi biết Python và tôi đang gặp rắc rối dịch mã này vào Ruby:Sử dụng bậc cao chức năng trong Ruby

def compose1(f, g): 
    """Return a function h, such that h(x) = f(g(x)).""" 
    def h(x): 
     return f(g(x)) 
return h 

Tôi có phải dịch này sử dụng khối? Hoặc là có một cú pháp tương tự trong Ruby?

+2

Chào mừng bạn đến StackOverflow. Một lời cảnh cáo, "Dịch mã này từ ngôn ngữ X sang ngôn ngữ Y" thường không được ưa chuộng ở đây. Yours là một chút tốt hơn so với bình thường vì nó có vẻ như bạn đã đào xung quanh một chút và có một số ý tưởng những gì bạn đang làm: "Tôi có phải dịch này bằng cách sử dụng các khối?". Điều đó nói rằng, tôi hy vọng ai đó biết ruby ​​đến cùng và cung cấp cho bạn một câu trả lời tốt - Tôi sẽ không nhớ câu trả lời cho điều này :-) – mgilson

+0

Tôi đang ở giữa việc học Python bản thân mình, vì vậy tôi sẽ để tránh xa việc đăng một giải pháp mã cho điều này. Nhưng tôi rất khuyên bạn nên tham khảo tài liệu hướng dẫn này khi cố gắng dịch mã giữa Python/Ruby/Perl/PHP (đã được rất hữu ích cho tôi trong dịch Perl-> Python): http://hyperpolyglot.org/scripting – uptownnickbrown

+0

Oh, xấu của tôi. Tôi chắc chắn không biết rằng câu hỏi dịch thuật được xem xét. Tôi đã chỉ tự hỏi nếu có cú pháp tương tự trong Python vì tất cả các kết quả của Google của tôi đã đề cập đến các khối .. nhưng tôi sẽ ghi nhớ điều đó. Cảm ơn! – etabelet

Trả lời

3

phép nói rằng fg là những phương pháp sau đây:

def f(x) 
    x + 2 
end 

def g(x) 
    x + 3 
end 

Chúng ta có thể xác định compose1 như:

def compose1(f,g) 
    lambda { |x| send(f, send(g, x)) } 
end 

Để làm việc này, chúng ta cần phải xác định h như:

h = compose1(:f, :g)

Bạn sẽ cần phải chuyển các tên phương thức như là một chuỗi/biểu tượng cho send để hoạt động. Sau đó, bạn có thể làm

h.call 3 # => 8. Thông tin thêm có thể được tìm thấy here

+0

Hoàn hảo! Cảm ơn bạn! – etabelet

+0

Tôi nghĩ câu trả lời này rõ ràng hơn nhưng Zach Kemp thì đẹp hơn. – sunnyrjuneja

+0

Zach là tốt đẹp, nhưng điều này cho phép bạn sử dụng các phương pháp hiện có mà không thực hiện thay đổi cho họ, mà chắc chắn có lợi ích của nó. – TheDude

6

Bạn có thể làm điều này với lambdas trong Ruby (Tôi đang sử dụng 1,9 stabby-lambda đây):

compose = ->(f,g) { 
    ->(x){ f.(g.(x)) } 
} 

Vì vậy compose là một hàm trả về chức năng khác, như trong ví dụ của bạn:

f = ->(x) { x + 1 } 
g = ->(x) { x * 3 } 

h = compose.(f,g) 
h.(5) #=> 16 

Lưu ý rằng lập trình hàm không thực sự phù hợp với Ruby - có thể thực hiện được nhưng có vẻ hơi lộn xộn theo ý kiến ​​của tôi.

2

sử dụng lambdas

def compose1(f,g) 
    return lambda{ |x| f.call(g.call(x)) } 
end 

dụ chạy

compose1(lambda{|a| a + 1}, lambda{|b| b + 1}).call(1) 
+1

Procs và lambdas là những thứ khác nhau (mặc dù tương tự). Bạn đã viết về procs nhưng sử dụng lambdas. – skalee

+0

điểm hợp lệ .. Đã chỉnh sửa .. –

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