有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