Chạy đoạn mã sau,Điều này có ý nghĩa gì trong ngôn ngữ Ruby?
a = [1, 2, 3, 4, 5]
head, *tail = a
p head
p tail
Bạn sẽ nhận được kết quả
1
[2, 3, 4, 5]
Ai có thể giúp tôi để giải thích tuyên bố head,*tail = a
, Cảm ơn bạn!
Chạy đoạn mã sau,Điều này có ý nghĩa gì trong ngôn ngữ Ruby?
a = [1, 2, 3, 4, 5]
head, *tail = a
p head
p tail
Bạn sẽ nhận được kết quả
1
[2, 3, 4, 5]
Ai có thể giúp tôi để giải thích tuyên bố head,*tail = a
, Cảm ơn bạn!
head, *tail = a
có nghĩa là chỉ định phần tử đầu tiên của mảng a
đến head
và gán các phần tử còn lại cho tail
.
*
, đôi khi được gọi là "toán tử splat", có một số thứ có mảng. Khi nó ở phía bên trái của một toán tử gán (=
), như trong ví dụ của bạn, nó chỉ có nghĩa là "lấy mọi thứ còn lại."
Nếu bạn bỏ qua splat trong mã đó, nó sẽ làm điều này thay vì:
head, tail = [1, 2, 3, 4, 5]
p head # => 1
p tail # => 2
Nhưng khi bạn thêm splat để tail
nó có nghĩa là "Tất cả những gì không được gán cho biến trước (head
), chỉ định cho tail
. "
Tôi không biết Ruby chút nào, nhưng tôi đoán là tuyên bố chia danh sách a
thành phần đầu (phần tử đầu tiên) và phần còn lại (danh sách khác), gán giá trị mới cho biến head
và tail
.
Cơ chế này thường được gọi (ít nhất là trong Erlang) là pattern matching.
Đầu tiên, đó là bài tập song song. Trong ruby bạn có thể viết
a,b = 1,2
và sẽ là 1 và b sẽ là 2. Bạn cũng có thể sử dụng
a,b = b,a
để trao đổi các giá trị (không có điển hình temp-biến cần thiết trong các ngôn ngữ khác).
Dấu sao * là toán tử gói/giải nén. Viết
a,b = [1,2,3]
sẽ gán 1 cho a và 2 đến b. Bằng cách sử dụng dấu sao, các giá trị 2,3 được đóng gói thành một mảng và được gán cho b:
a,*b = [1,2,3]
Câu trả lời hay! :) nhưng bạn thực sự nên thay đổi pic hồ sơ của bạn, bạn trông giống như một con chó xù được chải chuốt quá mức;) hehe – horseyguy
Haha. Tôi chưa từng có cái đó trước đây. Tôi sẽ đưa nó theo lời khuyên. :) –
@banister: Hình ảnh hiện tại của anh ấy (có thể không giống với hình ảnh cũ được sử dụng sau đó) khiến anh ấy trông giống Justin Bieber! –