有没有办法定义一个接受一个参数或根本不接受任何参数的方法

时间:2013-11-01 11:56:46

标签: ruby

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

3 个答案:

答案 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