Рубиновый экземпляр класса с 2 параметрами - PullRequest
0 голосов
/ 09 февраля 2019

Справка по Ruby, где я ошибаюсь, это работает, если я просто инициализирую logger:, но если я пытаюсь добавить table_name, я не получаю правильный синтаксис, пожалуйста, помогите кому-нибудь, направьте меня в правильном направлении.

class Test

     def initialize(logger:, table_name:)
         @ec2 = Aws::EC2::Client.new
         @ddb = Aws::DynamoDB::Client.new
         @logger = logger
         @table_name = table_name
     end
end

logger = Logger.new(STDERR)
table_name = ENV['ec2_information'].split('/')[1]

discovery = Test.new(logger:, table_name:)

Stacktrace

"/var/task/test.rb:87: syntax error, unexpected ','\n... 
Test.new(logger:, table_name:)\n...                              ^",
"errorType": "Init<SyntaxError>",

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Существует два решения этой ошибки, и какое из них вы предпочитаете, зависит от вас и от выразительности, которую вы хотите достичь.

Именованные параметры

В первом используются именованные параметры (также называемые аргументы ключевого слова ), которые вы используете в своем методе 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 })

То же самое нельзя сделать для именованных параметров.

0 голосов
/ 09 февраля 2019

Когда вы пишете Test.new(logger:, table_name:), Ruby-интерпретатор считает, что ваш аргумент - это хеш, а :logger - это ключ.

Поэтому он ожидает, что значение этого ключа должно быть.Но вместо этого - запятая.

Вот почему синтаксическая ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...