Ruby - метод вызова, передающий значения массива в качестве каждого параметра

В настоящее время я застрял в этой проблеме. Я подключился к функции method_missing в классе, который я создал. Когда вызывается несуществующая функция, я хочу вызвать другую функцию, которая, как я знаю, существует, передав массив args в качестве всех параметров второй функции. Кто-нибудь знает способ сделать это? Например, я хотел бы сделать что-то вроде этого:

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

(О, и кстати, приведенный выше пример у меня не работает)

ИЗМЕНИТЬ

Это код, который работает на основе предоставленного ответа (в приведенном выше коде есть ошибка):

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

person Markus Orreilly    schedule 29.03.2010    source источник


Ответы (1)


splat массив args: send(real_method, *args)

person horseyguy    schedule 29.03.2010