我正在尝试设置默认参数,我想跳过传递参数并在函数调用中分配特定参数。但是,我无法获得所需的输出。
require "json"
def stun(voltage = 0,frequency = 0,range = "",scope = "")
body = {
:voltage => voltage,
:frequency => frequency,
:range => range,
:scope => scope
}
response = body.to_json
end
stun(voltage = 1,frequency = 2,scope = "universal")
正如您在上面的代码中看到的,我正在尝试为范围赋值,同时保持范围参数为空字符串。我收到了以下回复。
"{\"voltage\":1,\"frequency\":2,\"range\":\"universal\",\"scope\":\"\"}"
我想要的输出是将范围作为空字符串,范围为“通用”
答案 0 :(得分:11)
您已为参数设置默认值,但您仍在使用位置参数,第一个参数将始终转到voltage
,第二个参数转移到frequency
,第三个参数转移到{{ 1}},第四个range
。由于您传递了3个参数,因此最终会传递scope
,voltage
和frequency
。
方法调用中的那些等号不符合您的想法。您不是要告诉ruby要分配哪个参数,而是使用这些名称创建一个局部变量:
range
Ruby确实有一种使用命名参数的方法来做你想要的事情:
stun(voltage = 1,frequency = 2,scope = "universal")
puts [voltage, frequency, scope].inspect # => [1, 2, "universal"]
自Ruby 2.0以来,这是可用的(我相信)。如果您使用这些,您将始终需要使用其名称传递参数,例如:
def stun(voltage: 0, frequency: 0, range: "", scope: "")
body = {
:voltage => voltage,
:frequency => frequency,
:range => range,
:scope => scope
}
response = body.to_json
end
puts stun(voltage: 1, frequency: 2, scope: "universal")
# => {"voltage":1,"frequency":2,"range":"","scope":"universal"}
现在提升stun(1, 2, "", "universal")
。在我看来,这不是一件坏事,只需记住一些事情。
答案 1 :(得分:1)
你考虑过传递哈希吗?
def stun(params)
body = {
voltage: 0,
frequency: 2,
range: '',
scope: ''
}
body.merge!(params)
response = body.to_json
end
stun({voltate: 1, frequency: 2, scope: 'universal'})
=> "{\"voltage\":0,\"frequency\":2,\"range\":\"\",\"scope\":\"universal\",\"voltate\":1}"