2010-12-28 23 views
11

Trong ruby, bạn có thể làm điều này:Ruby - trọng/cho phép nhiều nhiệm vụ (ví dụ 'a, b, c = d, e, f`)

d = [1, 2, 3] 
a, b, c = d 

a, bc, sẽ nhận được các giá trị 1, 2 và 3 tương ứng.

d, trong trường hợp này trong một Array và ruby ​​biết gán nội dung của nó để a, bc. Nhưng, nếu dFixnum, ví dụ: chỉ a sẽ được chỉ định cho giá trị d trong khi bc sẽ được chỉ định nil.

Thuộc tính nào của d cho phép nó được sử dụng cho nhiều bài tập? Trong quá trình khám phá của tôi cho đến nay, tôi chỉ có thể tạo ra các thể hiện của các lớp con của Array hoạt động theo cách này.

Trả lời

11

Đây là một tính năng rất không có giấy tờ, và tôi sẽ sử dụng nó một cách thận trọng, nhưng ở đây chúng tôi đi. Từ cuốn sách The Ruby Lập trình Ngôn ngữ:

Khi có nhiều lvalues ​​và chỉ một rvalue đơn, Ruby cố gắng mở rộng rvalue vào một danh sách các giá trị chuyển nhượng. Nếu giá trị là một mảng , Ruby sẽ mở rộng mảng sao cho mỗi phần tử trở thành giá trị riêng của nó. Nếu giá trị không phải là một mảng nhưng triển khai phương thức to_ary, Ruby gọi phương thức đó và sau đó mở rộng mảng mà nó trả về.

Trong Ruby 1,8 nó là to_ary phương pháp, trong Ruby 1.9 tài liệu nói nó gọi to_splat, nhưng tôi đã không kiểm tra (không 1.9 trong máy này) Nó không làm việc như mong đợi. Vì vậy, bạn phải xác định phương thức to_ary trong đối tượng của mình.

class Week 
    def to_ary 
    %w(monday tuesday wednesday thursday friday saturday sunday) 
    end 
end 

mon, tue, wed, thu, *weekend = Week.new 

* %w(...) Là một ký hiệu đặc biệt cho một loạt các từ ngữ, nếu bạn là lười biếng để viết ['monday', 'tuesday' ...]

+0

Tôi nghĩ Hãy thử Ruby! sử dụng 1.9. Hoặc bạn hoàn toàn có thể thả và sử dụng jQuery RVM. –

+0

:) Trên thực tế đã đi đến 'rvm install 1.9.1' sau câu trả lời – Chubas

7

Thuộc tính nào của d cho phép nó được sử dụng cho nhiều bài tập?

d phải có một Array hoặc được chuyển đổi thành một. IOW nó phải là một thể hiện của lớp Array (hoặc bất kỳ lớp con của nó) hoặc trả lời các to_ary nhắn:

def (not_an_array = Object.new).to_ary; [:foo, :bar, :baz] end 

foo, bar, baz = not_an_array 

foo # => :foo 
bar # => :bar 
baz # => :baz 

Lưu ý rằng đây là một ví dụ của một mô hình tổng quát hơn trong Ruby: hầu hết các phương pháp trong Ruby mong đợi một số Array, một số String, số Integer hoặc Float cũng sẽ chấp nhận một đối tượng phản hồi to_ary, to_str, to_int hoặc to_float. Và các phương pháp của riêng bạn cũng phải được thực hiện bằng cách!

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