【问题标题】:Is it right to assign multiple variables like this a = b = c = d = 5?像这样分配多个变量a = b = c = d = 5是否正确?
【发布时间】:2010-05-28 13:30:02
【问题描述】:
a = b = c = d = 5

puts (a) >> 5
puts (b) >> 5
puts (b) >> 5
puts (b) >> 5
a= a+1
puts (a) >> 6
puts (b) >> 5

我发现像这样分配值没有问题。我的问题是应该像上面给出的那样分配还是像这样分配?

a , b, c, d = 5, 5, 5, 5

【问题讨论】:

  • 您上面的示例也适用于 nil truefalse :)

标签: ruby-on-rails ruby


【解决方案1】:

这里要注意的是,您的情况只能正常工作,因为数字在 Ruby 中是不可变的。您希望对字符串、数组、哈希或除数字以外的任何其他内容执行此操作,因为它会创建对同一对象的多个引用,这几乎肯定不是您想要的:

a = b = c = d = "test"
b << "x"
=> "testx"
a
=> "testx"

而并行形式对所有类型都是安全的:

a,b,c,d = "test","test","test","test"
=> ["test", "test", "test", "test"]
b << "x"
=> "testx"
a
=> "test"

【讨论】:

  • 用你打算用作常量的任何字符串都可以做到这一点,对吧?
  • 你可以把它干得更远:a, b, c, d = %w(test) * 4
【解决方案2】:

以这种方式分配它没有任何问题 (a = b = c = d = 5)。如果所有变量都需要具有相同的值,我个人更喜欢它而不是多重赋值。

这是另一种方式:

a, b, c, d = [5] * 4

【讨论】:

  • 五件事对四个变量?
  • @Donal:哎呀。我想这对没有人想要的额外 5 个是刻薄的。 :(
【解决方案3】:

如果感觉好,就去做。

正如您发现的那样,该语言允许它,并且它的行为符合您的预期。我建议你应该问自己的唯一问题是关于表现力:代码是否告诉你它的目的是什么?

就个人而言,除了初始化为默认值(最好是零)之外,我并不特别喜欢将此构造用于其他用途。理想情况下,如此初始化的变量也都具有类似的目的,例如计数器。但是,如果我有多个类似用途的变量,我可能会考虑将它们声明为一种重复形式,以重构为例如 Hash。

【讨论】:

  • +1,这是正确答案。我不确定哪种形式更惯用,但我只能想到需要这种分配的少数情况。
【解决方案4】:

这两个初始化表达了不同的含义。 a = b = c = d = 5 的意思是“我所有的变量都应该初始化为相同的值,这个值是 5”。另一个,a, b, c, d = 5, 5, 5, 5,意思是“我有一个变量列表,以及相应的初始化值列表”。

您的逻辑是所有变量都应该始终相同吗?那么第一个更好。如果没有,第二个可能会更好。另一个问题:你列出的 4 个变量是否全面?您是否可能会向该组添加或删除另一个变量?如果是这样,我会建议另一种变体:

a = 5
b = 5
c = 5
d = 5

【讨论】:

    【解决方案5】:

    我曾经被那个咬过。它今天可能会为您节省一些击键,但稍后会咬您一口。正如@glenn 提到的,它创建了对同一个对象的多个引用。

    示例:这适用于 ruby​​ 1.81.9

    > a = b = Array.new
    => []
    > a.object_id == b.object_id
    => true
    > a << 1
    => [1]
    > b << 2
    => [1, 2]
    

    【讨论】:

      【解决方案6】:

      我根本不使用 ruby​​,所以这可能是一个可以接受的习惯用法,但 a = b = c = d = 5 对我来说看起来很丑。 a , b, c, d = 5, 5, 5, 5 看起来好多了,IMO。

      【讨论】:

      • 5,5,5,5是不是太重复了?
      • @ArnoldRoa 它比 [5] * 4, IMO 更易于维护
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多