【问题标题】:How to pass an optional argument into a Ruby method?如何将可选参数传递给 Ruby 方法?
【发布时间】:2012-09-11 17:07:15
【问题描述】:

我正在 Ruby 中进行一些 Watir-webdriver 测试,但似乎无法使以下代码正常工作。我想将一个可选的validation 参数传递给log_activity 方法。

def log_activity (type, *validation)
    #do something
end

我将以下参数传递给方法:

log_activity("license", 1)

我希望validation == 1 是真的,但它是假的:

puts validation.empty?
-> false

puts validation
-> 1

if validation == 1
    puts "validation!!!!"
else
    puts "WTF"
end
-> WTF

我做错了什么?

忘了说,我用的是 ruby​​ 1.9.3

【问题讨论】:

  • 使用puts 可以掩盖在这种情况下发生的事情,因为它“扁平化”了传递给它的数组。请尝试将其替换为 p

标签: ruby watir watir-webdriver


【解决方案1】:

*validation 是一个数组,包含第二个和之后的所有参数。鉴于它是一个数组,您看到的结果是有意义的。您想检查 *validation 数组中的第一个元素。

或者,如果你只会得到一个可选参数,你可以这样做:

def log_activity (type, validation=nil)
    #do something
end

那么validation 将是您传入的任何内容。

【讨论】:

  • 谢谢,只有一个可选参数。我没有意识到使用 * 会导致数组被传递。
【解决方案2】:

阅读“Method Arguments In Ruby”并查看“可选参数”。我发现它很方便。

我正在粘贴有用的内容:

可选参数

如果您想在运行时决定向方法提供多少(如果有的话)参数,Ruby 允许您这样做。定义方法时需要使用特殊符号,例如:

def some_method(*p)
end

您可以使用任意数量的参数(包括无参数)调用上述方法,例如:

some_method

some_method(25)

some_method(25,"hello", 45, 67)

所有这些都会起作用。如果没有提供参数,那么p 将是一个空数组,否则,它将是一个包含所有传入参数值的数组。

【讨论】:

    【解决方案3】:

    当您在 Ruby 中使用 *args 作为最后一个参数时,args 是一个数组。

    不幸的是,在 Ruby 1.8 上,array.to_s == array.join("")

    试一试

    if validation == [1]
    

    if validation.first == 1
    

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      相关资源
      最近更新 更多