Существует два решения этой ошибки, и какое из них вы предпочитаете, зависит от вас и от выразительности, которую вы хотите достичь.
Именованные параметры
В первом используются именованные параметры (также называемые аргументы ключевого слова ), которые вы используете в своем методе initialize
:
def initialize(logger:, table_name:)
...
end
Если вы хотите отправить такой метод, независимо от того, является ли он new
или любой другой метод, вы также должны сделать это поименованным способом.В текущем примере это будет означать
Test.new(logger: logger, table_name: table_name)
Но поскольку параметры именуются, и, как таковое, порядок не важен, это также может быть
Test.new(table_name: table_name, logger: logger)
Безымянные параметры
Другое решение состоит в том, чтобы определить сигнатуру метода без именования параметров
def initialize(logger, table_name) # no colon
...
end
Учитывая такую сигнатуру метода, порядок имеет значение, и вам придется отправить, например,
Test.new(logger, table_name) # no colon
Хеш-параметр
Именованные параметры не следует путать с принятием хеш-значения для параметра.Подпись будет:
def initialize(hash)
# do something with hash[:logger] and hash[:table_name]
...
end
Но метод send будет выглядеть так же, как и с именованными параметрами
Test.new(logger: logger, table_name: table_name)
Но это только из-за того, что интерпретатор рассматривает его как хеш.Вы также можете отправить метод в его канонической форме для такой подписи
Test.new({ logger: logger, table_name: table_name })
То же самое нельзя сделать для именованных параметров.