Ruby Programming | 连载 08 - Ruby 方法参数

简介: Ruby Programming | 连载 08 - Ruby 方法参数

一、Ruby 方法参数

Ruby 中的方法可以携带 0 个或者多个参数,也可以使用可变的参数变量,本文中将使用几种不同的方法来测试 Ruby 中方法参数的含义。

Ruby 方法中必选参数和可选参数有什么区别?

在调用 Ruby 方法时,如果方法包含了一定数量的参数,则必须提供正确数量的参数,否则,Ruby 解释器会提示一个错误

image.png

ArgumentError (wrong number of arguments (given 1, expected 2))
复制代码

Ruby 方法支持不定长参数,只需要传入 *param 即可,param 表示变量名;

image.png

上述代码中的 *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 方中只能有一个不定长参数,当有多个参数时,不定长参数不能放在参数列表中的第一位,必须放在第一个(含有多个必选参数的情况下)必选参数和默认参数之后。

不定长参数必须放在参数列表的中间位置,必选参数仅放置在左边或者仅放置在右边,亦或者两边都可以。但是不可以将不定长参数放在必选参数的左边。


相关文章
|
存储 Ruby
Ruby Programming | 连载 10 - Ruby 的类
Ruby Programming | 连载 10 - Ruby 的类
|
Scala Ruby
Ruby Programming | 连载 09 - Ruby 变量
Ruby Programming | 连载 09 - Ruby 变量
Ruby Programming | 连载 07 - Ruby 对象的原生行为
Ruby Programming | 连载 07 - Ruby 对象的原生行为
Ruby Programming | 连载 07 - Ruby 对象的原生行为
|
Java C++ Ruby
Ruby Programming | 连载 06 - Ruby 面向对象
Ruby Programming | 连载 06 - Ruby 面向对象
Ruby Programming | 连载 06 - Ruby 面向对象
|
Linux 数据库 Ruby
Ruby Programming | 连载 05 - Ruby 工具集
Ruby Programming | 连载 05 - Ruby 工具集
|
存储 Java 数据挖掘
Ruby Programming | 连载 04 - Ruby 扩展基础
Ruby Programming | 连载 04 - Ruby 扩展基础
|
存储 IDE 开发工具
Ruby Programming | 连载 03 - Ruby 对象基础
Ruby Programming | 连载 03 - Ruby 对象基础
Ruby Programming | 连载 03 - Ruby 对象基础
|
存储 对象存储 Ruby
Ruby Programming | 连载 02 - Ruby 语法基础
Ruby Programming | 连载 02 - Ruby 语法基础
|
IDE Java Linux
Ruby Programming | 连载 01 - Intro and Setup
Ruby Programming | 连载 01 - Intro and Setup
Ruby Programming | 连载 01 - Intro and Setup