有2种指定默认值的方法
1,等号默认值法
语法:
def test(a = 10, b = 1)
a - b
end
优点:可以省略后位参数;不需要提供参数名;首参数之外可以留空
缺点:对参数顺序敏感(优先无默认值的参数);第一个参数不能留空
适用:参数较少的方法
运行例:
# 两个参数都使用默认值
test() # =>9
# a为2,b为默认值可以省略
test(2) # =>1
# a为2,b为3
test(2,3) # =>-1
# 前项不能省略
test(,0) # SyntaxError: syntax error, unexpected ',', expecting ')'
# 不允许使用关键词(数组型参数本来就没有关键词概念啊 亲)
test(a:10,b:20) # SyntaxError,
# 编程白学了系列(数组型参数只有顺序概念,没有参数名概念啊 青)
test(b=10,a=1) # 9
特别:混用默认值参数和普通参数
# Ruby会优先赋值无默认值的普通参数,例如:
def test(a = 10, b = 1, c)
a - b - c
end
test(1) # =>8 。参数数量等于普通参数量,参数1自动填补未设置普通参数的c。此时a=10,b=1,c=1
test(1,2) # =>-2 。参数数量超过了普通参数量,则最后的参数2填补c,首位的参数1替换a, 此时a=1,b=1,c=2
test(1,2,3) # =>-3 参数数量超过了普通参数量,则a=1,b=2,c=3
test(1,2,3,4) # Error 参数数量大于方法可接受的参数数量
2,关键词参数法(keyword arguments:)
语法:
def test(a: 1, b: 2)
a + b
end
优点:对参数顺序不敏感,可以随意给参数赋值
缺点:需要提供参数名
适用:参数较多的方法
运行例:
test(a:10,b:20) # 30
test(b: 3) # 4
补充:【2,关键词参数法】实际上是依赖Hash实现的,其底层逻辑如下:
# 以下test方法等同于def test(a: 5, b: 6)
def test(args = {})
default_args = {a: 5, b: 6} # 设置默认值
params = default_args.merge(args) # 将默认值与输入的参数合并,且优先后者
params[:a] + params[:b] # 这里是方法的处理例
end