我们已经了解了如何在Ruby中使用方法?我们非常清楚方法可能使用也可能不使用任何参数这一事实。让我们讨论消耗参数或具有预定义参数列表的方法。该参数列表可以包含任意数量的参数,但具有强制性,您必须使用方法的参数列表中指定的方法传递相同数量的参数。但是,这降低了代码的通用性,如果您创建了一个将三个数字相加的方法,但是时间要求是仅将两个数字相加会怎样。在这种情况下,您的功能将失败。一种方法是重载该方法,但问题是您可以重载该方法多少次,因为可能存在n种可能性,最终将使您的代码冗余。Ruby有一个很好的概念splat参数,它允许您在方法中传递任意数量的参数。Splat参数有两种类型,本文其余部分将进行讨论。
单个splat参数是通过*运算符实现的。您可以在它们的帮助下传递数组。请参考下面给出的语法,
def method_name( *args) ... end
以下示例将帮助您了解其实现,
def mul(*args) pro = 1 args.each do |ar| pro = pro * ar end return pro end puts "Product is #{mul(12,44,55,33,22,55)}" puts "Product is #{mul(1.2,4.4,5.5,3.3,2.2,5.5)}" puts "Product is #{mul(1,2)}" puts "Product is #{mul(100,45)}"
输出结果
Product is 1159567200 Product is 1159.5672000000002 Product is 2 Product is 4500
您可以在上面的代码中观察到我们已经创建了一个方法,该方法将乘以传入的所有参数。我们正在从splat运算符获取帮助,该操作符允许我们传递所需的尽可能多的参数。我们在每个方法调用中传递了不同数量的参数。如果不是这种情况,那么我们可能必须为不同数量的参数定义不同的方法。
在Ruby 2.0中引入了double splat参数的概念。该实现与单个splat参数非常相似,但是其附加功能也适用于哈希。它在**运算符的帮助下实现。以下是语法,它将告诉您如何使用双splat参数。
def show( **args) ... end
现在,让我们通过其示例来更好地理解它。
def fruits (**fruits_and_color) fruits_and_color.each do |frt, color| puts "Fruits: #{frt}" puts "Color: #{color}" end end data1 = { "Kiwi": "Green", "Peach": "Pink", "Banana": "Yellow", "Grapes": "Green" } data2 = { "Kiwi": "Green", "Peach": "Pink", "Banana": "Yellow", "Grapes": "Green", "Watermelon": "Blue" } fruits data1 fruits data2
输出结果
Fruits: Kiwi Color: Green Fruits: Peach Color: Pink Fruits: Banana Color: Yellow Fruits: Grapes Color: Green Fruits: Kiwi Color: Green Fruits: Peach Color: Pink Fruits: Banana Color: Yellow Fruits: Grapes Color: Green Fruits: Watermelon Color: Blue => {:Kiwi=>"Green", :Peach=>"Pink", :Banana=>"Yellow", :Grapes=>"Green", :Watermelon=>"Blue"
在上面的代码中,您可以看到我们已经创建了两个哈希data1和data2。我们创建了一个方法结果,并将这些具有不同条目数的哈希传递给该方法。