我似乎无法做到这一点(我以前在Python中可以做到这一点).让我解释 ..
假设我在Ruby中有以下方法:
def someMethod(arg1=1,arg2=2,arg3=3)
...
...
...
end
Run Code Online (Sandbox Code Playgroud)
现在我可以这样称呼这种方法
someMethod(2,3,4)
someMethod(2,3)
someMethod(2)
Run Code Online (Sandbox Code Playgroud)
并且参数是由它们各自的顺序进行的..但是如果我想在编程中的某个时刻给出arg2并且想要arg1和arg3的默认值呢?
我尝试编写someMethod(arg2 = 4),但这似乎不适用于Ruby 1.9.它做的是它仍然认为arg1是4.在python我至少可以逃脱这个,但在红宝石中我不确定.有没有人有任何优雅的想法?
MBO*_*MBO 13
现在只有优雅的解决方案是使用hash作为参数列表:
def some_method(options = {})
defaults = {:arg1 => 1, :arg2 => 2, :arg3 => 3}
options = defaults.merge(options)
...
end
Run Code Online (Sandbox Code Playgroud)
后来在代码中使用隐式哈希调用方法时:
some_method()
some_method(:arg1 => 2, :arg2 => 3, :arg3 => 4)
some_method(:arg2 => 4)
Run Code Online (Sandbox Code Playgroud)
在Ruby 1.9中,您可以使用新的哈希键语法来更像Python:
some_method(arg1: 2, arg2: 3, arg3: 4)
Run Code Online (Sandbox Code Playgroud)
如果你想要更简单的语法并且仍然能够使用位置参数,那么我建议你玩这样的东西:
def some_method(*args)
defaults = {:arg1 => 1, :arg2 => 2, :arg3 => 3}
options = args.last.is_a?(::Hash) ? args.pop : {}
options = defaults.merge(options)
arg1 = args[0] || options[:arg1]
arg2 = args[1] || options[:arg2]
arg3 = args[2] || options[:arg3]
...
end
some_method()
some_method(2)
some_method(3,4,5)
some_method(arg2: 5)
some_method(2, arg3: 10)
Run Code Online (Sandbox Code Playgroud)
如果您想模仿Ruby参数号检查方法,可以添加:
fail "Unknown parameter name(s) " + (options.keys - defaults.keys).join(", ") + "." unless options.length == defaults.length
Run Code Online (Sandbox Code Playgroud)
编辑:
我用JonasElfström的评论更新了我的答案
| 归档时间: |
|
| 查看次数: |
3752 次 |
| 最近记录: |