带有2个参数的Ruby实例化类

时间:2019-02-09 12:33:42

标签: ruby

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 :(得分: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是键。

因此,它期望该键应该有一个值。而是用逗号代替。

这就是语法错误的原因。