Sunday, October 26, 2008

(6)利用字典对象实现命名参数功能

在其他一些语言中(比如Python)支持方法的命名参数调用,比如你有一个方法有两个参数name和age,并且他们都有缺省值,那么你可以通过指定参数名而只给这个方法传递某一个参数,不幸的是,Ruby不提供这样的语法支持。一个变通的方法(或者说我们玩些小花招),你可以用一个字典对象作为方法的参数,那么你可以通过把字典对象总的元素键当作参数名,把字典对象中的元素值当作参数值的方式来实现这一功能,比如下面的例子:
def sequence(args)
 
  n = args[:n] || 0
  m = args[:m] || 1
  c = args[:c] || 0

  a = []                      
  n.times {|i| a << m*i+c }   
  a                           
end
然后你可以给这个方法传递一个字典对象参数:
sequence({:n=>3, :m=>5})      # => [0, 5, 10]
作为一种特殊的方式Ruby允许你把参数的花括号{}去掉,所以你可以写成这样:
sequence(:m=>3, :n=>5)        # => [0, 3, 6, 9, 12]

# Ruby 1.9 的写法
sequence c:1, m:3, n:5        # => [1, 4, 7, 10, 13]
不过,说实话比起Python的语法格式,这只能算是一种变通的用法,因为,你不能直观的看出这个方法到底有多少个参数,都是什么。

No comments: