【问题标题】:ruby's Parallel assignment to assign same value over simple assignmentruby 的并行赋值在简单赋值上分配相同的值
【发布时间】:2013-05-06 06:56:50
【问题描述】:

有没有区别:

1.

> lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
=> [0, 0, 0, 0]

2.

> lines, codelines, total_lines, total_codelines = 0
=> 0

如果是,那么应该在什么情况下使用它们中的哪一个?

[编辑] 还有第三种方式:

    lines = codelines = total_lines = total_codelines = 0

> lines = codelines = total_lines = total_codelines = 0
=> 0
irb(main):016:0> lines
=> 0
irb(main):017:0> codelines
=> 0
irb(main):018:0> total_lines
=> 0
irb(main):019:0> total_codelines

如果是数组

0> a = b = { }; a[:a] = 6
=> 6
irb(main):023:0> b = 3
=> 3
irb(main):024:0> a
=> {:a=>6}
irb(main):025:0> a = 10
=> 10
irb(main):026:0> b
=> 3
> a.object_id
=> 21
irb(main):028:0> b.object_id
=> 7

【问题讨论】:

  • 还有lines = codelines = total_lines = total_codelines = 0,但你在这样做时需要小心共享参考问题。
  • ^^共享参考问题?
  • a = b = { }; a[:a] = 6你会发现问题的。
  • ^^我试过了,但没有发现任何区别。发布更新结果:s
  • ba[:a] = 6 之后是什么样子?

标签: ruby variable-assignment


【解决方案1】:

这两者的区别在于第二个例子只是将0分配给lines

lines, codelines, total_lines, total_codelines = 0,0,0,0

codelines #=> 0

而当并行赋值中右值的数量小于左值的数量时:

lines, codelines, total_lines, total_codelines = 0

codelines #=> nil

剩余价值分配nil

所以,第二种并行赋值实际上没有意义,除非您需要在特定范围内使用nil 初始化变量;例如迭代之外的计数器。

【讨论】:

    【解决方案2】:

    有区别。

    1.

    lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
    

    右侧的值与左侧的变量一样多。每个值都将分配给每个变量。

    2.

    lines, codelines, total_lines, total_codelines = 0
    

    右侧的值没有左侧的变量多。缺失值将补充为nillines 将变为 0,其余的将变为 nil。没有理由你应该使用这样的赋值。

    当您想要使用右侧值数量较少的多个变量时,一个典型的情况是当您有一个不知道它有多少元素的数组时。

    a, b, *c = some_array
    

    在上述情况下,根据some_arrayabc 的长度,将分配不同的东西。

    【讨论】:

      猜你喜欢
      • 2018-11-01
      • 2016-04-18
      • 1970-01-01
      • 2021-08-13
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      相关资源
      最近更新 更多