2010-03-29 44 views
14

Tôi hiện đang bị kẹt trong vấn đề này. Tôi đã nối vào hàm method_missing trong một lớp mà tôi đã tạo. Khi một hàm được gọi là không tồn tại, tôi muốn gọi một hàm khác mà tôi biết tồn tại, chuyển mảng args như tất cả các tham số cho hàm thứ hai. Có ai biết cách để làm điều này không? Ví dụ, tôi muốn làm một cái gì đó như thế này:Ruby - Giá trị truyền phương thức cuộc gọi của mảng như mỗi tham số

class Blah 
    def valid_method(p1, p2, p3, opt=false) 
     puts "p1: #{p1}, p2: #{p2}, p3: #{p3}, opt: #{opt.inspect}" 
    end 

    def method_missing(methodname, *args) 
     if methodname.to_s =~ /_with_opt$/ 
      real_method = methodname.to_s.gsub(/_with_opt$/, '') 
      send(real_method, args) # <-- this is the problem 
     end 
    end 
end 

b = Blah.new 
b.valid_method(1,2,3)   # output: p1: 1, p2: 2, p3: 3, opt: false 
b.valid_method_with_opt(2,3,4) # output: p1: 2, p2: 3, p3: 4, opt: true 

(Oh, và btw, ví dụ trên không làm việc cho tôi)

EDIT

Đây là mã mà làm việc, dựa trên câu trả lời được cung cấp (có một sai lầm trong đoạn code trên):

class Blah 
    def valid_method(p1, p2, p3, opt=false) 
     puts "p1: #{p1}, p2: #{p2}, p3: #{p3}, opt: #{opt.inspect}" 
    end 

    def method_missing(methodname, *args) 
     if methodname.to_s =~ /_with_opt$/ 
      real_method = methodname.to_s.gsub(/_with_opt$/, '') 
      args << true 
      send(real_method, *args) # <-- this is the problem 
     end 
    end 
end 

b = Blah.new 
b.valid_method(1,2,3)   # output: p1: 1, p2: 2, p3: 3, opt: false 
b.valid_method_with_opt(2,3,4) # output: p1: 2, p2: 3, p3: 4, opt: true 

Trả lời

25

splat mảng args: send(real_method, *args)

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