def test(a = 1, b = 2)
a + b
end
test() # =>3 两个参数都使用默认值
test(2) # =>4 a为2,b为默认值
test(2,3) # =>5 a为2,b为3
test(,0) # SyntaxError: syntax error, unexpected ',', expecting ')'
我想使用 a 的默认值,b 为 2 应该怎么调用这个方法
试了一下,报错了
SyntaxError: syntax error, unexpected tLABEL, expecting ')'
我的意思是 ab 都有默认值,现在使用 a 的默认值,给 b 重新传一个值。在某些语言里面可以 test(,3) 这么调用的
如果一定需要这个语法,可以考虑这样写:
[15] pry(main)>
[16] pry(main)> def test(args = {})
[16] pry(main)* default_args = {a: 5, b: 6}
[16] pry(main)* params = default_args.merge(args)
[16] pry(main)* params[:a] + params[:b]
[16] pry(main)* end
[19] pry(main)> test(a: 1)
=> 7
或者使用 options.fetch(key, default)
: https://robots.thoughtbot.com/ruby-2-keyword-arguments
Crystal 支持这种写法
icr(0.23.1) > def test(a = 1, b = 2)
icr(0.23.1) > a + b
icr(0.23.1) > end
=> ok
icr(0.23.1) > test(b: 3)
=> 4
icr(0.23.1) > test(2,3)
=> 5
可是我调用 test(b = 3 ),得到的结果是 5, 虽然传的参数是 b = 3,但是好像实际结果是 3 传到了形参的 a 里