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

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

共收到 17 条回复
9299

可以使用 keyword arguments:

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

test(b: 3)
A641da
9299gecko_gecko 回复

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

A641da
9299gecko_gecko 回复

试了一下,报错了

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

没错,你是什么版本ruby?

19159
A641datinyfeng 回复

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

F38485
A641datinyfeng 回复

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

F38485
A641datinyfeng 回复

参考下面格式:

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

p test(3)   #=> 8
A641da
F38485petersngg 回复

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

A641da
19159mlzhuyi 回复

1.9.3,看来不支持,哈哈

9299
A641datinyfeng 回复

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

[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
30794

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

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

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

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

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

De6df3

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

A641da
De6df3huacnlee 回复

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

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