2016-08-17 50 views
1

我有以下方法:红宝石调用可选参数

def method(a=1, b=2, c=3, d=4) 
    puts a 
    puts b 
    puts c 
    puts d 
end 

有没有办法像这样的输出,而不检查变量无效?当我打电话等方法:

method(5,7) 
=> 5 
=> 2 
=> 7 
=> 4 
+1

是应该怎么知道你省略b和d,而不是c和d,说什么? –

+0

你有没有考虑使用关键字参数:https://robots.thoughtbot.com/ruby-2-keyword-arguments (否则,没有办法) –

回答

1

的参数取入顺序,以便当有此方法:

def method(a=1, b=2, c=3, d=4) 
    puts a 
    puts b 
    puts c 
    puts d 
end 

呼叫:

method(5,7) 

指:a = 5, b = 7,c = 3(默认值),d = 4(默认值)

没有指定参数的方法,其他人。

如果你希望能够指定参数,另一种是使用哈希为所有PARAMS:

def method(options) 
    a = options[:a] || 1 
    b = options[:b] || 2 
    c = options[:c] || 3 
    d = options[:d] || 4 
end 

然后,您可以拨打电话如:

method(d: 5, c: 7) 

=> 1 
=> 2 
=> 7 
=> 5 
+0

你的第二个建议已被关键字参数所弃用。 –

+0

你是对的 - 同样的原则,但更现代的做法 – Martin

0

一流行的选择是用所谓的“命名参数”重新定义你的方法。那么,它们并不是真正的命名参数,它们只是一些带有一些语法糖的散列参数。

def method(args) 
    args = {a: 1, b: 2, c: 3, d: 4}.merge(args) 
    args.each { |key, val| puts val } 
end 

method(c: 30, a: 10) 

> 10 
> 2 
> 30 
> 4 
+0

这里使用关键字参数的好处是什么?你的代码似乎对我来说同样也更复杂。 –

+0

首先,它适用于Ruby 1.9。二,它仍然是流行的开源库中常用的模式,用于兼容性,而OP将有助于学习这种语法。 – Uzbekjon

+0

好吧,我认为如果你提到这个问题,它会改善你的答案。 –

1

正如Taryn East在他的评论中提到的,自从Ruby 2.0以来,您可以使用关键字参数来实现您想要做的事情。你只需要定义你的方法不同的一点:

def method(a:1, b:2, c:3, d:4) 
    puts a 
    puts b 
    puts c 
    puts d 
end 

然后,你可以把它指定要通过名称来设置参数,使别人的默认值:

method(a:5, c:7) 
=> 5 
=> 2 
=> 7 
=> 4 

作为另一个好处,它提高了可读性,并且不会让读者猜测传递值的含义。