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