2015-01-09 4 views

ответ

1

Проблема не в строке определения метода, которую вы опубликовали, проблема заключается в использовании переменной for внутри тела метода. Поскольку for является зарезервированным словом, вы не можете использовать его как простое имя переменной, но вы можете использовать его как часть хэша. В вашем случае это означает, что вы должны прибегать к использованию произвольных аргументов ключевого слова (**opts), но вы можете использовать ключевое слово_argument for: в вызове метода. Возможно, вы захотите поднять ArgumentError, если ключ отсутствует для подражания поведению подписи метода, который вы указали выше.

def register(something, on:, **opts) 
    raise ArgumentError, 'missing keyword: for' unless opts.has_key?(:for) 
    for_value = opts[:for] 

    puts "registering #{something} on #{on} for #{for_value}" 
end 

register 'chocolate chips', on: 'cookie' 
# ArgumentError: missing keyword: for 

register 'chocolate chips', on: 'cookie', for: 'cookie monster' 
# registering chocolate chips on cookie for cookie monster 
+0

Это один из способов :) Я надеялся не отклоняться от формата с именованным параметром, хотя –

+0

Я знаю его не очень красиво, но он получает работу и синтаксис вызова так же чист –

2

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

Дополнительные ресурсы, на которых ключевые слова являются зарезервированными в Ruby:

UPD

Actualy, вы все еще можете использовать : для символ в качестве ключа в хэш (скажем, варианты хэш), таким образом, вы можете написать так:

def test(something, options = {}) 
    puts something 
    puts options.values.join(' and ') 
end 

и он работает как шарм:

[4] pry(main)> test 'arguments', :for => :lulz, :with => :care, :while => 'you are writing code' 
arguments 
lulz and care and you are writing code 
+0

Я знаю его ключевое слово, я отметил, что в название. Я спросил, есть ли способ обойти это. каким-то образом получить доступ к ней динамически через текущую привязку или что-то еще? –

+1

@MichaelBaldry заглянуть в обновленную часть - достаточно ли этого для вас, или вы имели в виду другой путь? Кстати, по моему скромному мнению, использование ключевых слов таким образом может увеличить количество «WTF ?!» в строке. ;) –

+1

В обеих ссылках не упоминается '__ENCODING__'. Кроме того, поскольку 2.2.0 Ruby поставляется с официальным документом: '$ ri ruby: keywords'. – cremno

1
binding.local_variable_get(:for) 

это так, как я думал. Думаю, работает только в рубине 2.1+.

ПРИМЕЧАНИЕ: Не делайте этого, я просто интересно, как вы могли бы получить вокруг него, вы, вероятно, следует просто вызвать ваш именованный параметр что-то еще :)

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