Оператор splat для хэша для аргументов ключевых слов в определении метода ruby
У меня есть такой класс:
class AwesomeService
attr_reader :a, :b
def initialize(a: 30, b: 40)
@a = a
@b = b
end
end
Я пытаюсь сделать что-то вроде этого:
class AwesomeService
DEFAULTS = {
a: 30,
b: 40
}
attr_reader *DEFAULTS.keys
def initialize(**DEFAULTS)
@a = a
@b = b
end
end
так что я могу сохранить значения по умолчанию в отдельном хеше.
Но я получаю ошибку:
SyntaxError ((irb): syntax error, unexpected tCONSTANT, expecting ')')
def initialize(**DEFAULTS)
^~~~~~~~
Похоже, что оператор инициализации в инициализации не работает, как я ожидал. Но, похоже, это логичный способ сделать это. Что я здесь не так делаю?
1 ответ
Решение
Да... это не то, что вы можете сделать.
**foo
в списке аргументов указано, как вы собираете хеш kwargs, поэтому он не может быть таким же, как вы вводите его.
Что еще более важно, основной смысл kwargs состоит в том, что они разбивают хеш на локальные переменные - это не может работать, если он расширяет хеш во время выполнения.
Самое близкое, что вы могли бы получить, было бы что-то вроде:
def initialize(**values)
values = DEFAULTS.merge(values)
raise "..." unless (values.keys - DEFAULTS.keys).empty?
@a = values[:a]
@b = values[:b]
end