2013-06-05 127 views
8

我想将一个数组分成三个变量;第一值成一个变量,第二个到另一个变量,和所有其余的为一个字符串,例如:ruby​​数组首先把第二个变量放到变量中,其余变量放到另一个变量中

arr = ["a1","b2","c3","d4","e5","f6"] 
var1 = arr[0] # var1 => "a1" 
var2 = arr[1] # var2 => "b2" 
var3 = ? # var3 should be => "c3d4e5f6" 

需要什么样的代码,以实现每个变量列出的值?

+0

如果'var3'剩下的就应该是'[“c3”,“d4”,“e5”,“f6”],而不是'“c3d4e5f6”'。 – sawa

+0

它没有。看起来你根本不需要非连接数组,这与你在问题中说的不符。 – sawa

+0

@sawa现在好了吗? – BenjiWiebe

回答

9

这似乎不如什么:

arr = ["a1","b2","c3","d4","e5","f6"] 
var1 = arr[0]   # => "a1" 
var2 = arr[1]   # => "b2" 
var3 = arr[2..-1].join # => "c3d4e5f6" 

如果您不需要保留arr,你可以这样做:

arr = ["a1","b2","c3","d4","e5","f6"] 
var1 = arr.shift # => "a1" 
var2 = arr.shift # => "b2" 
var3 = arr.join # => "c3d4e5f6" 

其他人则指出了图示运营商,这是可以理解的,但我认为这比上面差:

arr = ["a1","b2","c3","d4","e5","f6"] 
var1, var2, *tmp = arr 
var3 = tmp.join 

因为是这样的:

arr = ["a1","b2","c3","d4","e5","f6"] 
var1, var2, *var3 = arr 
var3 = var3.join 

不过,这是一个需要注意的选项。

+1

谢谢!第二个例子是完美的。我刚进入ruby,并且我不知道array.shift。这正是我所期待的。 – BenjiWiebe

+0

“如果'arr'太短,两个版本都会指定'nil'”并不完全正确。例如'[] [2 ..- 1] .nil?'和'[0] [2 ..- 1] .nil?'都是真的。 –

+0

@ muistooshort谢谢;我删除了这一说法。 –

5

下面是一个使用splat assignment (aka array destructuring)一种替代形式:

arr = ["a1","b2","c3","d4","e5","f6"] 
# "splat assignment" 
var1, var2, *var3 = arr 
# note that var3 is an Array: 
# var1 -> "a1" 
# var2 -> "b2" 
# var3 -> ["c3","d4","e5","f6"] 

参见:

+0

我明白想要使用splat操作符,但实际上并没有给OP提供他们要求的东西。在我看来,让'var3'进入正确的状态(一个字符串)会失去很多splatting的价值。 –

+0

@DarshanComputing OP的问题是矛盾的OP是要求在问题中的数组,但是在预期的输出中给出一个字符串。应该指责的是这个问题,而不是这个答案。 – sawa

+0

@sawa我已经读了三次(包括编辑)的问题,并且我看不到他们要求数组的任何地方。这个问题和例子是100%一致的。所有三个变量都应该设置为字符串。这没有什么不明确之处。 –

4

使用图示操作者:

arr = ["a1","b2","c3","d4","e5","f6"] 
var1, var2, *var3 = arr 

# var1 => "a1" 
# var2 => "a2" 
# var3 => ["c3", "d4", "e5", "f6"] 
+0

我有你的保存反馈,因为我有user2246674:这让你在很大程度上在那里,但你没有完成,并且在我看来,让剩下的方式带走了大多数溅落的优雅。如果它在外面,我很乐意看到一些我没有想到的优雅。无论如何,这并不能回答这个问题。 –