2013-12-23 4 views
1

У меня есть блок, который передается как аргумент функции. Этот блок содержит несколько методов. Это как это:Доступ к методам в блоке Ruby

def func(&block) 
end 

func do 
    method1 
    method2(arg) 
    method3(arg) 
end 

Я хочу FUNC, чтобы вернуть состав функций в блоке:

method3 (method2 (method1)) 

Есть ли способ получить доступ к каждому из методов в блоке, так что я может использовать methods.reduce(method1) { |method| method.call arg } или что-то в этом роде?

Не могли бы вы дать мне несколько идей?

ответ

3

Нет, это невозможно. Вы могли (теоретически) разобрать код Ruby, связанный с определением блока, но я не уверен, что это имело бы смысл.

Ваш вопрос очень общий, вы не предоставляете никаких подробностей, если у вас есть контроль над блоком или нет, и пример в реальном мире, вероятно, будет более полезным.

Из деталей, которые у меня есть, я предлагаю вам разделить блок на начало координат. Вместо передачи всего блока, содержащего все эти методы, передайте массив методов в качестве аргумента, чтобы вы могли повторно использовать их так, как хотите.

Вы можете обернуть их в лямбду, чтобы отложить выполнение.

def func(*chain) 
end 

func(
    ->(arg) { method1 }, 
    ->(arg) { method2(arg) }, 
    ->(arg) { method3(arg) } 
) 

Вы также можете использовать Object.method принести метод и передать его в качестве параметра.

def func(*chain) 
end 

func(
    method(:method1), 
    method(:method2), 
    method(:method3) 
) 
+0

Мне нравится этот стиль 'method (: method1)' ... +1 –

+0

Спасибо за идеи! :) – Faery

+0

Поскольку я думаю о решении проблемы, возник еще один вопрос: существует ли способ получить массив значений, возвращаемых каждым методом в блоке, потому что 'result = yield block' будет содержать только значение возвращенный из последнего метода :( – Faery

Смежные вопросы