我正在编写一个程序,它检查文件是否作为参数传递给方法或函数,如果没有传递参数,那么它接受字符串通过gets。我知道*运算符,但正如我所说,我不需要一个参数数组。一个或没有,也没有默认值。有可能吗?
答案 0 :(得分: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
这种方式与你描述的方式完全相同。
答案 1 :(得分: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。使用的解决方案没有限制,因此更好。
答案 2 :(得分: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