2010-09-01 53 views

Trả lời

16

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. "

+0

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

+0

Haha. Tôi chưa từng có cái đó trước đây. Tôi sẽ đưa nó theo lời khuyên. :) –

+0

@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! –

0

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 headtail .

Cơ chế này thường được gọi (ít nhất là trong Erlang) là pattern matching.

8

Đầ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ác vấn đề liên quan