2010-07-08 3 views
0

Я пытаюсь разобраться, как вы передаете блоки в методы.Передача блока в метод

В принципе у меня есть метод, и вместо того, чтобы пользователь написать это:

def user_config 
    @config[:config_value] = "what they want" 
end 

Я хотел бы, чтобы они были в состоянии сделать это:

user_config do 
    :config_value => "what they want" 
end 

Но я не знаю, как для работы с блоком в методе.

+0

Я не уверен, что я понимаю вопрос, но почему бы ваш пользователь когда-либо определял * метод? Кроме того, версия блока выглядит почти так же, как пользователь просто передает простой хеш. Так почему бы не сделать это, а не блок? – Telemachus

ответ

3

Блоки вызываются с выходом, так что:

def user_config 
    yield.each do |k, v| 
     @config[k] = v 
    end 
end 

называют как этот

user_config do 
    {:config_value => "what they want"} 
end 

должен работать, как вы хотите. Блок возвращает

{:config_value => "what they want"} 

Вы берете каждый ключ в хэше и присваиваете его значение в хэш-конфигурации @config.

3

Хотя @diegogs прав, и его решение будет работать нормально, я бы избегал использовать блоки в таком простом случае.

def user_config(config_hash) 
    config_hash.each do |k,v| 
    @config[k] = v 
    end 
end 

будет делать только штрафом

user_config :config_value => "what they want", ... 

Как насчет этого?

+0

пример немного затуманен, и для драгоценного камня есть потенциальная конфигурация, поэтому блок будет более подходящим. – Arcath

+0

Также забыл упомянуть об этом, как им это делать сейчас – Arcath

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