和我一样许多习惯了java的程序员在刚刚开始接触ruby的时候对ruby当中的方法声名以及调用的方式会感到非常的奇怪和别扭。比如我们在ruby当中经常可以看到类似的方法声名 method(arg1, *args), 又如这样的方法 method2(arg2, &block), 等等。相比于java那明确简单的方法声名方式,ruby中的方法声名要灵活许多,下面就ruby当中常见的几种方法声名的形式,以及方法调用的方式做一个简要的总结:

1. 首先,不同于java的方法声名,ruby中的方法可以接收的参数是可变的,而不是像java那样必须和方法声名中的参数类型相等,个数相等。当你希望ruby方法接收一个或者多个参数的时候,可在普通的参数名前放置一个星号(*),比如:

def varargs(arg1, *rest)Received #{arg1} and #{rest.join(', ')}”
end

varargs("one") #=>"Received one and "

varargs("one","two") #=>"Received one and two"

varargs("one","two","three") #=>"Received one and two, three"

以上代码出自《programming ruby 中文版》p80

在这里,varargs方法的第二个形参前有一个星号,表示将方法中第二个以后的所有参数都装到一个数组当中,然后赋值给rest. 所以当方法声名的参数前边又一个*的时候,代表:将方法调用时传入的所有除之前已匹配完毕的参数外的剩余参数放入一个Array并将其赋值给*后边的形参。

2. 我们也经常会见到在方法声名的参数当中有“&args”的形式,比如

class TaxCalculator

  def initialize(name,&block)

    @name,@block = name, block

  end
  def get_tax(amount)

    "#{@name} on #{amount} = #{@block.call(amount)}"

  end
end
tc = TaxCalculator.new("Sales tax"){|amt| amt * 0.075}

tc.get_tax(100) #=>"Sales tax on 100 = 7.5"

tc.get_tax(200) #=>"Sales tax on 250 = 18.75"

以上代码出自《programming ruby 中文版》p81

当方法的最后一个参数前缀为&,那么改方法调用的后边可以跟一个block,同时方法会将block转换为一个Proc对象,然后赋值给该参数。

3. 我们经常可以在rails的文档中看到这种方法声名:

def method(id,option={})

  ...
end

然后我们调用的时候可以以任意的顺序传入key=>value hash pair 如:

method(5,key1=>value1,key2=>value2,...)

在参数列表中,当hash参数在正常参数之后,并且位于任何数组或block参数之前,我们就可以直接用key=>value对,而不用加{}。所有的这些key=>value对会被集合到一个hash,然后赋值给形参,传入方法。