gpt4 book ai didi

Ruby 并行赋值

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

我想测试一个并行赋值的返回值,我写了puts(x, y = 1, 2),但是不行,打印错误信息:

SyntaxError: (irb):74: syntax error, unexpected ',', expecting ')'
puts (x,y =1,2)
^
(irb):74: syntax error, unexpected ')', expecting end-of-input

有什么问题吗?

最佳答案

你有两个问题。

  1. puts( 之间的空格防止括号列表被解释为参数列表。一旦你在方法名后放置一个空格,任何argument list has to be outside the parentheses, and any parenthesized parts must be a legal expressions. Ruby, (x,y,z) 不是合法的单个表达式,因此会出现上述错误。

    如果你删除空格,你会得到这个:

    > puts(x, y = 1, 2)    
    NameError: undefined local variable or method `x' for main:Object

    那是因为你的第二个问题:

  2. 语句puts(x,y = 1,2)被解析为puts(x, y=1, 2);也就是说,Ruby 将其解释为将三个参数传递给 puts:x 是第一个,y=1 是第二个, 2 是第三个。由于 x 不在赋值的左侧并且尚未定义,因此会出现上述错误。

    使用一组额外的括号将整个赋值组合在一起作为一个参数:

    > puts((x,y=1,2))    
    1
    2

但请注意,这是传递包含两个项目的单个列表。它与 puts 没有区别,但对于区分列表和单个参数的方法会有所不同:

> def foo(a,b) puts "a=#{a},b=#{b}" end
> foo((x,y=1,2))
ArgumentError: wrong number of arguments (1 for 2)

所以在那种情况下,您还需要一个标点符号 - splat 运算符:

> foo(*(x,y=1,2))   
a=1, b=2

有趣但几乎没有实际意义的事实是,一旦你将括号加倍,你可以根据需要将空格放回去:

> puts ((x, y = 1, 2))    
1
2

但是,这再次将它们从参数包装器变成了一个额外的表达式包装器;您可以在不更改任何内容的情况下在其周围加上任意数量的括号。这意味着在 foo 情况下,splat 运算符必须超出两组括号:

> foo (*(x,y=1,2))
SyntaxError: (irb):24: syntax error, unexpected tSTAR
> foo *((x,y=1,2))
a=1, b=2

但是,当第一个参数本身包含圆括号时,通常认为使用无圆括号形式在 Ruby 中是不好的风格。根据您的 Ruby 版本,您可能会收到有关此类语句的警告,但即使您没有收到,也最好使用完全括号化的版本(方法名称后没有空格)。

关于Ruby 并行赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19403292/

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