2014-09-10 1 views
0

У меня есть серьезные проблемы, чтобы понять блоки с аргументами. Я хотел бы использовать такого рода рубинового код:Вложенные блоки с аргументами в Ruby

FooBar.foo do |foo_arg| 
    bar do |bar_arg| 
    define_method :hello!, foo_arg, bar_arg do 
     "Hello, #{foo_arg} and #{bar_arg}!" 
    end 
    end 
end 

include FooBar 
hello!(:Alice, :Bob) # => "Hello, Alice and Bob!" 

И сделать это так, я добавил thoses линии:

module FooBar 
    def self.foo &foo_block 
    instance_eval &foo_block 
    end 

    def self.bar &bar_block 
    instance_eval &bar_block 
    end 
end 

Но поскольку споры между трубами являются события, у меня есть синтаксис ошибка. Спасибо за любую помощь!

+0

Можете ли вы опубликовать свой фактический код? У этого нет никаких проблем с этим. – robbrit

+0

Вы вызываете 'instance_eval', но ничего не передаете блоку, так что вы ожидаете от' foo_arg'? Кроме того, 'define_method' должен иметь только один аргумент. Остальные должны быть частью поставляемого блока: 'define_method (: hello!) Do | foo_arg, bar_arg |'. – tadman

+0

Где вы получаете 'SyntaxError'? Что такое * точная формулировка 'SyntaxError', которую вы получаете? «Вот какой-то код, в нем есть некоторая ошибка, но я не собираюсь рассказать вам, что такое ошибка» не так уж и много. –

ответ

3

Ваш модуль работает правильно. Проблема заключается в использовании вами define_method. Параметры foo_arg и bar_arg должны быть частью блока, переданного в define_method.

module FooBar 
    def self.foo(&foo_block) 
    instance_eval &foo_block 
    end 

    def self.bar(&bar_block) 
    instance_eval &bar_block 
    end 

    foo do |foo_arg| 
    bar do |bar_arg| 
     define_method :hello! do |foo_arg, bar_arg| 
     "Hello, #{foo_arg} and #{bar_arg}!" 
     end 
    end 
    end 
end 

include FooBar 
hello!(:Alice, :Bob) # => "Hello, Alice and Bob!" 

должно делать то, что вы хотите.

+2

Отличная работа. –

+0

Спасибо @hjing. – Sisss

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

  • Нет связанных вопросов^_^