gpt4 book ai didi

ruby - 为什么在使用 *(星号)运算符作为方法参数时会出现 "Unexpected *"错误?

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:50 25 4
gpt4 key购买 nike

我目前正在学习 Ruby,遇到了这种特殊情况。

当我运行以下代码时,我得到了下面进一步显示的输出。

工作代码:

def hello(a,b=1,*c,d,e,f)
p a,b,c,d,e,f
end

hello(1,2,3,4,5)

工作代码输出:

1
2
[]
3
4
5

但是,在编辑代码以使参数“e”成为捕获所有参数时,我得到了下面进一步显示的错误。

失败代码:

def hello(a,b=1,c,d,*e,f)
p a,b,c,d,e,f
end

hello(1,2,3,4,5)

失败的代码输出:

a.rb:1: syntax error, unexpected *
def hello(a,b=1,c,d,*e,f)
^
a.rb:1: syntax error, unexpected ')', expecting '='
a.rb:3: syntax error, unexpected keyword_end, expecting end-of-input

我在 Ubuntu 上使用 ruby​​ 2.3.1p112(2016-04-26 修订版 54768)。

我很想知道第二段代码失败的原因。

编辑:

下面的代码也失败了。

def hello(a,b=1,c,d,e,*f)
p a,b,c,d,e,f
end

hello(1,2,3,4,5)

我得到了类似的错误

a.rb:1: syntax error, unexpected *
def hello(a,b=1,c,d,e,*f)
^
a.rb:3: syntax error, unexpected keyword_end, expecting end-of-input

最佳答案

相关文档为here这是一个相关的 question .不过,它们似乎并未涵盖所有情况。

这是我能收集到的:

  • 最多只能使用一个 splat 运算符 (*args)。
  • 可以使用多个默认参数 (a=1, b=2)。
  • 默认参数必须位于 splat 运算符的左侧。
  • 多个默认参数必须一个接一个地直接出现。
  • 如果使用默认参数和 splat 运算符,则默认参数必须位于 splat 运算符之前。
  • 如果遵循上述规则,则默认参数和 splat 运算符可以位于参数列表中的任何位置。

为了可读性,最好是:

  • 将 splat 运算符作为最后一个参数
  • 避免将默认参数放在中间

这里是有效的方法定义:

def  hello(a = 1, b)            ;end
def hello(a, b = 2) ;end
def hello(a = 1, b = 2) ;end
def hello(a = 1, b = 2, c) ;end
def hello(a, b = 2, c = 3) ;end
def hello(a, b = 2, *c) ;end
def hello(a, b = 2, *c, d) ;end
def hello(a = 1, b = 2, *c, d) ;end

对于你的第二个例子,这个语法就可以了:

def hello(a,b,c,d=1,*e,f)
p a,b,c,d,e,f
end

有关 block 和关键字参数的更完整示例,请参阅@JörgWMittag 的优秀 answer .

关于ruby - 为什么在使用 *(星号)运算符作为方法参数时会出现 "Unexpected *"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41968193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com