Оператор 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
Другие вопросы по тегам