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>",
答案 0 :(得分:2)
该错误有两种解决方案,您更愿意选择哪种解决方案以及要实现的表现力。
第一个使用命名参数(也称为keyword arguments),这是您目前在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 })
不能对命名参数执行相同的操作。
答案 1 :(得分:0)
当您编写Test.new(logger:, table_name:)
时,Ruby解释器会认为您的参数是哈希,而:logger
是键。
因此,它期望该键应该有一个值。而是用逗号代替。
这就是语法错误的原因。