ruby中的默认参数

时间:2018-02-20 03:22:15

标签: ruby

我正在尝试设置默认参数,我想跳过传递参数并在函数调用中分配特定参数。但是,我无法获得所需的输出。

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\":\"\"}"

我想要的输出是将范围作为空字符串,范围为“通用”

2 个答案:

答案 0 :(得分:11)

您已为参数设置默认值,但您仍在使用位置参数,第一个参数将始终转到voltage,第二个参数转移到frequency,第三个参数转移到{{ 1}},第四个range。由于您传递了3个参数,因此最终会传递scopevoltagefrequency

方法调用中的那些等号不符合您的想法。您不是要告诉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}"