【问题标题】:Initialize two variables on same line在同一行初始化两个变量
【发布时间】:2013-12-26 12:51:26
【问题描述】:

我找不到有关此概念的权威示例或讨论。如果我的 Ruby 方法中有 2 个变量是数字,我需要将它们初始化为零。它们将用作计数器。这行得通还是安全?它适用于我的测试。

而不是这个:

foo = 0
bar = 0

你能做到吗?

foo = bar = 0

这似乎是一种节省线条并保持表现力的好方法。或者,这是一个不好的做法?我意识到我会牺牲一点可读性。但是,在一个小的 Ruby 方法(

【问题讨论】:

    标签: ruby


    【解决方案1】:

    这可行,但您应该知道它只对您的情况是安全的,因为您使用的是数字变量,这些变量在 Ruby 中是不可变的。例如,如果您对字符串尝试相同的操作,最终可能会出现一些您没有预料到的行为:

    ruby-1.9.2-p180 :001 > foo = bar = "string"
     => "string" 
    ruby-1.9.2-p180 :002 > foo.upcase!
     => "STRING" 
    ruby-1.9.2-p180 :003 > bar
     => "STRING"
    

    【讨论】:

      【解决方案2】:

      最好在同一行初始化两个变量,只要分配的值简短易懂。您甚至可以使用数组语法分配两个不同的值。

      foo = bar = 123
      foo #=> 123
      bar #=> 123
      
      foo, bar = 1, 2
      foo #=> 1
      bar #=> 2
      

      【讨论】:

      • 谢谢!我更喜欢: foo, bar = 1, 2 我没想到那个。而且它仍然可读。
      【解决方案3】:

      在许多语言中,后者将同一个对象分配给两个变量,如果对象是可变的,这可能会很麻烦。最好这样做:

      foo, bar = 0, 0
      

      【讨论】:

      【解决方案4】:

      这很奇怪。

      Ignacio Vazquez-Abrams 的答案对于使用不同值初始化变量是正确的:
      a, b = 123, 456

      但是,我认为您关心的是执行以下操作:
      a = b = "hello"

      但是等等!上述行为变量ab 分配相同的内存地址,即
      a.object_idb.object_id 相等。因此,a 上的任何更改都会在 b 上持续存在。

      我不喜欢它,但可能是一种解决方法。
      x = "a very long string or something you don't want to type multiple times"
      a, b, c = x.clone, x.clone, x.clone

      哦,我希望有一种优雅的方式来做到这一点。

      【讨论】:

        【解决方案5】:

        安全且有效。

        完全取决于你的编码标准,这样的事情是否令人不悦。

        使用它并留待以后重构。

        【讨论】:

          猜你喜欢
          • 2015-01-17
          • 2019-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 2012-03-27
          相关资源
          最近更新 更多