3

我正在编写一个程序,它检查文件是否作为参数传递给方法或函数,如果没有传递参数,则它通过gets接受字符串。我知道 * 运算符,但正如我所说,我不需要参数数组。一个或无,也没有默认值。有什么办法可以吗?

4

3 回答 3

6

可选参数可以通过默认值模拟:

def my_method(arg = nil)
  #do something with arg
end

您可以将其称为my_method()my_method(arg)。如果未给出参数,则与传入 nil 值相同。尽管我建议尽可能使用更有意义的默认值。

如果你想要一个真正的可选参数,但仍然需要在调用太多时引发异常,你可以使用 splat 并插入一个保护子句:

def my_method(*args)
  raise ArgumentError if args.length > 1
  #do something with args.first
end

这样,它的行为与您描述的完全一样。

于 2013-11-01T12:06:31.017 回答
3

如果存在一个参数从不采用的值,例如nil,那么您可以将其用作默认值:

def foo arg = nil
  if arg.nil?
    # argument was not given
  else
    # argument was given
  end
end

您可以将原始模块定义为常量,这可以使您摆脱这种限制:

module NeverUsedValue; end
def foo arg = NeverUsedValue
  if arg == NeverUsedValue
    # argument was not given
  else
    # argument was given
  end
end

否则,如果不使用 splat,可能无法做到这一点。

def foo *args
  case args.length
  when 1
    # argument was given
    arg = args.first
  when 0
    # argument was not given
  end
end

我不知道你为什么拒绝使用 splat。使用的解决方案没有限制,因此更好。

于 2013-11-01T12:01:01.967 回答
2

这是对默认参数的一点滥用。不要在家里尝试这个。

def foo(bar = gets)
  puts "Got this: #{bar}"
end

foo('a param')
foo

输出

% ruby script.rb
Got this: a param
from gets
Got this: from gets
于 2013-11-01T12:07:23.600 回答