2013-01-06 18 views
10

tôi đã chọc qua mã Rails hôm nay và stumbled khi this snippet:* * (dấu hai chấm dấu hoa thị) làm gì trong Ruby?

new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday)) 

gì dấu hoa thị-đúp dấu hai chấm (hoặc splat-đúp thư ruột kết nếu bạn sẽ) trong *::Date làm gì?

Có lẽ nó có liên quan đến phạm vi lớp học đặc biệt có tên là Date ... nhưng cần thiết để tác giả đưa nó thay vì chỉ sử dụng lớp tiêu chuẩn Date.

Trả lời

11

Tôi đã đọc mã sai; nó hoàn toàn không phải là toán tử "* ::".

Đây là những gì đang xảy ra:

  • Tìm lớp Date trong phạm vi toàn cầu (::Date)
  • gọi _parse() để có được một hash của các giá trị
  • gọi values_at để biến băm vào một mảng
  • sử dụng toán tử dấu hoa thị trong hàm tiêu biểu của nó để biến mảng thành nhiều đối số cho một phương thức gọi
  • gọi new_date(), chuyển các phần tử mảng vào cho các đối số year, monmday của chúng.

Việc thiếu khoảng trống giữa các nhà khai thác *:: khiến điều này gây nhầm lẫn. : - \

+3

Điểm dấu đầu tiên nên nói "trong phạm vi ** toàn cục **". Phạm vi hiện tại sẽ không có '::'. – sepp2k

+0

@ sepp2k Cố định, cảm ơn! –

+5

Và đó là một ví dụ tuyệt vời tại sao đôi khi, sử dụng các biến cục bộ là một ý tưởng hay. –