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