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

tinyfeng · September 26, 2017 · Last by tinyfeng replied at October 09, 2017 · 4738 hits
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)
Reply to gecko_gecko

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

Reply to gecko_gecko

试了一下,报错了

SyntaxError:  syntax error, unexpected tLABEL, expecting ')'
Reply to tinyfeng

没错,你是什么版本 ruby?

Reply to tinyfeng

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

Reply to tinyfeng

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

Reply to tinyfeng

参考下面格式:

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

p test(3)   #=> 8
Reply to petersngg

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

Reply to mlzhuyi

1.9.3,看来不支持,哈哈

Reply to 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
Reply to gecko_gecko

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

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

test(b=3) #=> 4
Reply to ichord

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

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

Reply to huacnlee

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

You need to Sign in before reply, if you don't have an account, please Sign up first.