2012-05-13 10 views
39

Từ kiểm tra tài liệu cho Ruby 1.9.3, cả mảng # < < và Array # được thiết kế để bổ sung phần tử vào cuối mảng hiện tại. Tuy nhiên, dường như có sự khác biệt tinh tế giữa hai người.Ruby - Sự khác biệt giữa mảng # << và Array # push

Người tôi gặp phải là toán tử * có thể được sử dụng để nối thêm nội dung của toàn bộ mảng khác vào mảng hiện tại, nhưng chỉ với #push.

a = [1,2,3] 
b = [4,5,6] 

a.push *b 
=> [1,2,3,4,5,6] 

Cố gắng sử dụng # < < thay vì cung cấp cho các lỗi khác nhau, tuỳ thuộc vào việc nó được sử dụng với các dot điều hành và/hoặc dấu ngoặc đơn.

Tại sao # < < không hoạt động giống như cách #push hoạt động? Là một trong những thực sự không phải là một bí danh cho người khác?

+1

so sánh điều này để nối thêm và mở rộng trong python http: // stackoverflow.com/questions/252703 – dreftymac

Trả lời

69

Chúng rất giống nhau, nhưng không giống nhau.

<< chấp nhận một đối số duy nhất và đẩy nó vào cuối mảng. Mặt khác,

push chấp nhận một hoặc nhiều đối số, đẩy tất cả chúng vào cuối.

Thực tế là << chỉ chấp nhận một đối tượng duy nhất là lý do bạn thấy lỗi.

+1

Để mở rộng điều này, bạn có thể viết nhanh 'đẩy' 2 mảng bằng + =. Sử dụng << để thêm một giá trị vào một mảng. – TomDunning

+0

@Isotope - Điều đó tạo ra các đối tượng thừa, vì vậy nó nên được coi là một mô hình chống trừ khi bạn thực sự không muốn sửa đổi mảng đầu tiên. – x1a4

+0

Tôi tin rằng phiên bản hiện tại của Ruby không cho phép "<<" tham gia nhiều hơn một đối số. –

9

Lý do tại sao << không hoạt động và push làm là:

  1. push có thể chấp nhận nhiều đối số (đó là những gì sẽ xảy ra khi bạn làm *b).
  2. << chỉ chấp nhận một đối số.
0

Phương thức push chắp thêm một mục vào cuối mảng. Nó có thể có nhiều đối số. << được sử dụng để khởi tạo mảng và chỉ có thể có một đối số, thêm phần tử vào cuối mảng nếu đã được khởi tạo.

6

Sự khác biệt chính giữa Array # < < và Array # push là

Array#<< # can be used to insert only single element in the Array 

Array#push # can be used to insert more than single element in the Array 

Một khác biệt đáng kể là, Trong trường hợp chèn yếu tố duy nhất,

Mảng # < < là nhanh hơn so với mảng # đẩy

Benchmarking có thể giúp tìm ra hiệu suất của hai cách này, tìm thêm here .

6

Một điểm quan trọng cần lưu ý ở đây là << cũng là một toán tử. Và nó có ưu tiên thấp hơn so với một số toán tử như toán tử bậc ba. Điều này có thể dẫn đến một số kết quả không mong muốn. ví dụ:

arr1, arr2 = [], [] 

arr1.push true ? 1 : 0 
arr1 
# => [1] 

arr2 << true ? 1 : 0 
arr2 
# => [true]