如何确定Ruby中是否传递了可选参数

Jac*_*lyn 5 ruby parameters optional-parameters

如果我在Ruby中有以下方法:

def foo(arg1, arg2 = "bar")
  puts arg1
  puts arg2
end
Run Code Online (Sandbox Code Playgroud)

有没有办法确定用户是否在方法中传递了值arg2?显然我可以添加if arg2 == "bar"到方法中,但这并没有捕获用户手动传入的情况"bar".当然,我可以将默认设置为没有用户可以传递的内容,但随后很快就变得非常难看.

那里有什么优雅的东西吗?

Jör*_*tag 16

def foo(arg1, arg2 = (arg2_not_passed = true; "bar"))
  puts arg1
  puts arg2
  puts 'arg2 was passed' unless arg2_not_passed
end
Run Code Online (Sandbox Code Playgroud)


Vid*_*dya 1

我不确定这是否可能。考虑以下:

class Test
  def method(a,b=1)
    local_variables.each do |var|
          puts "Setting #{var} to #{eval var.to_s}"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后尝试调用method以下实例Test

?> t.method(1)
Setting a to 1
Setting b to 1
=> [:a, :b]

?> t.method(1,2)
Setting a to 1
Setting b to 2
=> [:a, :b]

?> t.method(1,1)
Setting a to 1
Setting b to 1
=> [:a, :b]
Run Code Online (Sandbox Code Playgroud)

这些不区分方法的调用方式。

所以我建议将 @sawa 的方法与以下方法混合:

raise ArgumentError, "Too many arguments" if args.length > 2
Run Code Online (Sandbox Code Playgroud)

因为您似乎想将参数限制为 2 并且 @sawa 的方法允许未定义的数字。

这是针对非正统需求的非正统方法,因此只需确保您的方法的客户端了解 API 的工作原理即可。