2011-05-14 70 views
20

我无法找到此概念的权威示例或讨论。如果我的Ruby方法中有两个变量是数字,我需要将它们初始化为零。他们将被用作计数器。这是好还是安全?它在我的测试中起作用。在同一行上初始化两个变量

取而代之的是:

foo = 0 
bar = 0 

你可以做到这一点?

foo = bar = 0 

这似乎是一个很好的方式,以节省线路,仍然有表现。或者,这是不好的做法?我意识到我会牺牲一点可读性。但是,在一个小的Ruby方法(< 10行)中,这可能不是一个有效的关注点。

回答

15

在很多语言中,后者将两个变量分配给同一个对象,如果该对象是可变的,则会造成麻烦。最好做到这一点:

foo, bar = 0, 0 
+0

在某些语言中是正确的,但在Ruby中与所提问题无关。 IMO完全没问题。 – Phrogz 2011-05-14 15:58:04

+0

@Progrog,这在Ruby中工作正常。 – jasonleonhard 2015-11-26 22:27:45

+1

它工作正常,但不推荐,可读性较差。 https://github.com/bbatsov/ruby-style-guide#parallel-assignment – 2017-01-08 19:00:32

1

它是安全的,它的工作原理。

完全取决于您的编码标准,不管这样的事情是否被压抑。

使用它,等待时间到了以后重构。

25

在同一行上初始化两个变量是很好的做法,只要该值被分配为简短且易于遵循。您甚至可以使用数组语法分配两个不同的值。

foo = bar = 123 
foo #=> 123 
bar #=> 123 

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

谢谢!我很喜欢:foo,bar = 1,2我没有想到那个。它仍然可读。 – mrjabba 2011-05-14 15:53:14

30

这工作,但你应该知道,这是因为您使用的是数字变量,这是在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" 
7

这很奇怪。

伊格纳西奥巴斯克斯 - 艾布拉姆斯的答案是与不同的价值观与初始化变量真:
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

哦,我希望能有这样的一种优雅的方式。

+0

对我来说这看起来很优雅... – 2016-12-13 21:32:05