2013-06-05 18 views
8

Tôi muốn chia mảng thành ba biến; giá trị đầu tiên vào một biến, biến thứ hai thành biến khác và tất cả các biến còn lại thành một chuỗi, ví dụ:mảng ruby ​​đặt đầu tiên, thứ hai thành biến, và phần còn lại vào một biến khác

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

Mã nào cần để đạt được giá trị được liệt kê cho mỗi biến?

+0

Nếu 'var3' lấy phần còn lại, nó phải là' ["c3", "d4", "e5", "f6"] ', không phải' "c3d4e5f6" '. – sawa

+0

Nó không. Có vẻ như bạn không muốn mảng không tham gia, không khớp với những gì bạn nói trong câu hỏi. – sawa

+0

@sawa Tốt hơn bây giờ ?? – BenjiWiebe

Trả lời

9

Điều này có vẻ tốt như bất cứ điều gì:

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

Nếu bạn không cần phải giữ gìn arr, bạn có thể làm:

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

Những người khác chỉ ra các nhà điều hành splat, đó là điều dễ hiểu , nhưng tôi nghĩ điều này còn tệ hơn những điều trên:

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

Như sau:

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

Tuy nhiên, đó là một tùy chọn cần lưu ý.

+1

Cảm ơn! Ví dụ thứ hai là hoàn hảo. Tôi chỉ nhận được vào ruby, và tôi không biết về array.shift. Đó chính xác là những gì tôi đang tìm kiếm. – BenjiWiebe

+0

"Cả hai phiên bản đều gán' nil' nếu 'arr' quá ngắn" không hoàn toàn đúng. Ví dụ '[] [2 ..- 1] .nil?' Và '[0] [2 ..- 1] .nil?' Đều đúng. –

+0

@muistooshort Cảm ơn; Tôi đã xóa khiếu nại đó. –

5

Dưới đây là một hình thức thay thế sử dụng 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"] 

Xem thêm:

+0

Tôi hiểu muốn sử dụng toán tử splat, nhưng bạn chưa thực sự đưa ra OP những gì họ yêu cầu. Bắt 'var3' vào trạng thái chính xác (một chuỗi) mất nhiều giá trị của splatting, theo ý kiến ​​của tôi. –

+0

@ DarshanComputing Câu hỏi của OP là mâu thuẫn OP yêu cầu một mảng trong câu hỏi, nhưng đang đưa ra một chuỗi trong kết quả mong đợi. Những gì được đổ lỗi là câu hỏi, không phải câu trả lời này. – sawa

+0

@sawa Tôi đã đọc câu hỏi ba lần (bao gồm cả chỉnh sửa) và tôi không thể thấy bất kỳ nơi nào họ yêu cầu mảng. Câu hỏi và các ví dụ là phù hợp 100%. Tất cả ba biến phải được đặt thành chuỗi. Không có sự mơ hồ về điều này. –

4

Sử dụng các nhà điều hành splat:

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

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

Tôi có phản hồi lưu cho bạn như tôi đã có cho người dùng2246674: điều này giúp bạn phần lớn ở đó, nhưng bạn chưa hoàn thành, và nhận được phần còn lại của cách lấy đi nhiều sự sang trọng của splatting, theo ý kiến ​​của tôi. Tôi rất muốn được thể hiện một cái gì đó tao nhã mà tôi chưa từng nghĩ đến, nếu nó ở ngoài kia. Trong mọi trường hợp, điều này không trả lời câu hỏi. –

Các vấn đề liên quan