Ruby Ruby 方法的参数有默认值怎么调用

tinyfeng · 2017年09月26日 · 最后由 tinyfeng 回复于 2017年10月09日 · 4819 次阅读
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 应该怎么调用这个方法

可以使用 keyword arguments:

def test(a: 1, b: 2)
  a + b
end

test(b: 3)
gecko_gecko 回复

学习了,另外如果像 def test(a = 1, b = 2) 这样常规定义不可以缺省调用吗

gecko_gecko 回复

试了一下,报错了

SyntaxError:  syntax error, unexpected tLABEL, expecting ')'
tinyfeng 回复

没错,你是什么版本 ruby?

tinyfeng 回复

可以看下是不是 ruby 版本的问题,2.0 之后才支持这种语法

tinyfeng 回复

2.0 后是支持 keyword arguments 语法,检查下 ruby 版本

tinyfeng 回复

参考下面格式:

def test(a=5, b )
  a + b
end

p test(3)   #=> 8
petersngg 回复

我的意思是 ab 都有默认值,现在使用 a 的默认值,给 b 重新传一个值。在某些语言里面可以 test(,3) 这么调用的

mlzhuyi 回复

1.9.3,看来不支持,哈哈

tinyfeng 回复

如果一定需要这个语法,可以考虑这样写:

[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

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
gecko_gecko 回复

好吧,看来我想要的 test( , 2) 这种调用在 ruby 里并不适用

def test(a = 1, b = 2)
  a + b
end

test(b=3) #=> 4
ichord 回复

可是我调用 test(b = 3 ),得到的结果是 5, 虽然传的参数是 b = 3,但是好像实际结果是 3 传到了形参的 a 里

楼主头像好讨厌,总让我以为 CDN 坏了

huacnlee 回复

哈哈哈,我 qq 微信也是这个头像~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号