Ruby并行分配

Ruby并行分配,ruby,Ruby,我想测试并行赋值的返回值,我写put(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 有什么问题吗?这应该可以 puts( (x, y = 1, 2) ) 一组括号用于方法调用,另一组括号用

我想测试并行赋值的返回值,我写
put(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
有什么问题吗?

这应该可以

puts( (x, y = 1, 2) )
一组括号用于方法调用,另一组括号用于将赋值修饰为显式表达式。

您有两个问题

  • 放置
    之间的空格(
    防止括号内的列表被解释为参数列表。在方法名称后放置空格后,任何参数列表都必须在括号外,任何括号内的部分都必须是合法表达式。在Ruby中,
    (x,y,z)
    不是合法的单一表达式,因此会出现上述错误

    如果删除该空间,则会得到以下结果:

    > puts(x, y = 1, 2)    
    NameError: undefined local variable or method `x' for main:Object
    
    那是因为你的第二个问题:

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

    使用一组额外的括号将整个赋值分组为一个参数:

    > puts((x,y=1,2))    
    1    
    2    
    
  • 但请注意,这是传递一个包含两个项的列表。它与
    put
    没有区别,但对于区分列表和单个参数的方法来说会有区别:

    > 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
    
    puts((x, y = 1, 2))
    

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

    puts是一种获取参数并打印的方法。在方法中,您可以将参数值设置为任何默认值。在您的情况下,它不是并行赋值,而是设置默认值。如果您这样做

    >puts(a, b = 1, 2)
    => undefined local variable or method `a' for main:Object
    from (irb):1
    
    但如果你设定了“a”的值,说“a=99”,然后做

     >puts(a, b = 1, 2)
     99
     1
     2
     => nil 
    
    在ruby中,如果显式指定“()”,则无法在方法名和打开之间指定空格(

    def高(x,y,z)
    PX
    p y
    PZ
    结束
    =>零
    2.0.0p247:015>hi(1,2,3)
    1.
    2.
    3.
    => 3 
    2.0.0p247:016>hi(1,2,3)
    SyntaxError:(irb):16:语法错误,意外的',',应为''
    嗨(1,2,3)
    ^
    from/home/prasad/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in'start'
    from/home/prasad/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in'start'
    from/home/prasad/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands.rb:64:in`'
    从箱子/轨道:4:in“require”
    从箱子/轨道:4:in`'
    2.0.0p247:017>高1,2,3
    1.
    2.
    3.
    => 3 
    
    是一种方法,您试图将返回值
    =
    (赋值)传递给它。为此,您必须将其用两对括号括起来:

    > foo (*(x,y=1,2))
    SyntaxError: (irb):24: syntax error, unexpected tSTAR
    > foo *((x,y=1,2))
    a=1, b=2
    
    puts((x, y = 1, 2))
    
    但是,这会导致代码混乱,应该避免

    而是分两步进行,更简单、更干净:

    x, y = 1, 2
    puts x, y
    

    此外,您可以删除
    put
    行而不中断功能。

    尝试不使用空格
    put(x,y=1,2)
    请站立,不要在参数括号前加空格,请-matz…这将产生警告,因为
    put
    之间的空格(
    )。