将 Ruby 数组的第一项和第二项赋值给变量,将剩余项赋值给另一个变量。

9
我想把一个数组分成三个变量:第一个值被放入一个变量中,第二个值被放入另一个变量中,所有剩余的值被放到一个字符串中,例如:
arr = ["a1","b2","c3","d4","e5","f6"]
var1 = arr[0] # var1 => "a1"
var2 = arr[1] # var2 => "b2"
var3 = ? # var3 should be => "c3d4e5f6"

需要哪些代码才能实现每个变量所列出的值?

如果var3取剩下的部分,它应该是["c3","d4","e5","f6"],而不是"c3d4e5f6" - sawa
它并没有。看起来你根本不想要非连接的数组,这与你在问题中所说的不符。 - sawa
现在有点明白了。 - sawa
1
@sawa 哇!从你嘴里说出来,这是非常高的赞美!(不过我并不生你的气) - BenjiWiebe
3个回答

19
这似乎是最好的选择:
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
“Both versions assign nil if arr is too short” 这句话并不完全正确。例如 [][2..-1].nil?[0][2..-1].nil? 都是 true。 - mu is too short
@muistooshort 谢谢,我已经删除了那个声明。 - Darshan Rivka Whittle

6

我理解想要使用splat运算符的想法,但实际上你并没有给出OP所要求的内容。在我看来,将var3转换为正确的状态(字符串)会失去很多splatting的价值。 - Darshan Rivka Whittle
@DarshanComputing 这个问题的提问者有矛盾之处。提问者在问题中要求一个数组,但是在期望输出中给出了一个字符串。应该责怪的是问题本身,而不是这个回答。 - sawa
@sawa 我已经读了三遍问题(包括编辑),我没有看到他们在哪里要求一个数组。问题和示例是100%一致的。所有三个变量都应设置为字符串。这方面没有任何歧义。 - Darshan Rivka Whittle
@DarshanComputing 输入是一个数组,早期版本的问题要求将第一个、第二个和剩余的元素分别作为第一个、第二个和第三个变量,没有提到连接或转换为字符串。如果从数组中取出除了两个元素以外的所有元素,你会得到一个数组。第一个和第二个元素从一开始就是字符串。 - sawa

4
使用展开运算符:
arr = ["a1","b2","c3","d4","e5","f6"]
var1, var2, *var3 = arr

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

我对您和user2246674有同样的反馈:虽然这个方法可以解决大部分问题,但并不完美,而且在我看来,它会破坏掉splatting的优雅之处。如果有更好的方法,我很乐意学习。总之,这个方法并没有回答问题。 - Darshan Rivka Whittle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接