一、Ruby 方法参数
Ruby 中的方法可以携带 0 个或者多个参数,也可以使用可变的参数变量,本文中将使用几种不同的方法来测试 Ruby 中方法参数的含义。
Ruby 方法中必选参数和可选参数有什么区别?
在调用 Ruby 方法时,如果方法包含了一定数量的参数,则必须提供正确数量的参数,否则,Ruby 解释器会提示一个错误
ArgumentError (wrong number of arguments (given 1, expected 2)) 复制代码
Ruby 方法支持不定长参数,只需要传入 *param
即可,param 表示变量名;
上述代码中的 *names 表示调用方法时可以传递 0 个或者多个参数,且参数会被分配到一个数组中,当传递 0 个参数的时候,就是一个空数组。
在定义 Ruby 方法参数的时候,必选参数显示定义,非必选参数可以使用 *param 来代替,如下代码所示:
# Ruby 方法参数 obj = Object.new def obj.hi(name, age, *other_info) puts "I am #{name}, age is #{age}, and #{other_info}" end obj.hi("Steve", 18) obj.hi("Stark", 30, "bilionaire") obj.hi("Ruby", 20, "OOP", "Easy Learn") 复制代码
执行上述代码,输出结果如下:
I am Steve, age is 18, and [] I am Stark, age is 30, and ["bilionaire"] I am Ruby, age is 20, and ["OOP", "Easy Learn"] 复制代码
如何为 Ruby 方法中的参数分配默认值
当给一个参数设置默认值时,会使在函数调用时没有提供参数的情况下,与参数对应的变量将会接收默认值,参数的默认值使用 =
和一个具体的值表示:
def default_args(a, b, c=2) puts "args value #{a}, #{b}, #{c}" end default_args(1, 3) default_args(1, 2, 3) 复制代码
执行上述代码,输出结果如下:
args value 1, 3, 2 args value 1, 2, 3 复制代码
方法调用时,参数 c 没有提供任何值,因此输出的参数 c 的值为方法定义时的默认值,如果调用时给参数 c 提供值,则会输出提供的值。
Ruby 方法中参数排列的顺序
Ruby 方法中的参数包含了默认参数,必填参数以及可选参数,那么在定义方法时如何定义这些参数在参数列表中的顺序呢?
def mix_args(a, b=1, *c, d) puts "args value #{a}, #{b}, #{c}, #{d}" end mix_args(1, 2, 3, 4, 5, 6) mix_args(7, 8, 9, 10) mix_args(10, 11, 12) mix_args(13,14) mix_args(15) 复制代码
执行上述代码,输出结果如下:
args value 1, 2, [3, 4, 5], 6 args value 7, 8, [9], 10 args value 10, 11, [], 12 args value 13, 1, [], 14 Traceback (most recent call last): 1: from /method_ex3.rb:3:in `mix_args': wrong number of arguments (given 1, expected 2+) (ArgumentError) 复制代码
上述代码中定义的 mix_args 函数有四个参数,其中有两个是必填参数,参数 a 和 参数 d,参数 b 含有默认值不是必填参数,参数 c 是不定长参数。
当调用 mix_args 时只给一个参数时,输出结果会报错,因为至少要提供两个参数;当给两个参数时,两个参数会分别按照位置赋值给两个必填参数 a 和 d;当给定三个参数时,会将三个参数按照位置赋值给必填参数和默认参数;当给定参数大于等于 4 个时,多处的参数会全部赋值给不定长参数 c。
Ruby 的参数分配优先级为,必填参数 > 默认参数 > 不定长参数。
Ruby 方中只能有一个不定长参数,当有多个参数时,不定长参数不能放在参数列表中的第一位,必须放在第一个(含有多个必选参数的情况下)必选参数和默认参数之后。
不定长参数必须放在参数列表的中间位置,必选参数仅放置在左边或者仅放置在右边,亦或者两边都可以。但是不可以将不定长参数放在必选参数的左边。