Tạo hoặc nối vào mảng trong Ruby


83
foo ||= []
foo << :element

Cảm thấy hơi lắt léo. Có cách nào thành ngữ hơn không?


11
Đây cách nói thành ngữ. Bạn có thể viết một dòng như vậy (foo ||= []) << :element, nhưng tôi thấy nó xấu hơn.
Sergio Terrysev

4
IMO cách thích hợp là có các giá trị ban đầu. Nếu bạn có || = và << cho cùng một biến trong cùng một phương thức, IMO của bạn có mùi mã và đã làm sai điều gì đó. Hỏi cách làm || = << độc đáo là chỉ làm mỹ phẩm thay vì sửa chữa vấn đề thực sự.
apeiros

Câu trả lời:


138
(foo ||= []) << :element

Nhưng meh. Có thực sự khó khăn khi giữ cho nó có thể đọc được không?


39
+1 cho "Có thực sự khó khăn khi giữ cho nó có thể đọc được không?" Khả năng đọc là vua.
the Tin Man

Nếu foobản thân nó là một biểu thức phức tạp hơn, chẳng hạn như một hàm băm (lồng nhau) trong đó bạn tra cứu các giá trị, thì đây là một cách hay để tránh tìm kiếm các giá trị nhiều lần hoặc sử dụng một biến khác cho giá trị mảng đã tra cứu.
sschuberth

60

Bạn luôn có thể sử dụng phương thức push trên bất kỳ mảng nào. Tôi thích nó hơn.

(a ||= []).push(:element)

10

Bạn cũng có thể hưởng lợi từ Kernel # Array , như:

# foo = nil
foo = Array(foo).push(:element)
# => [:element]

có lợi ích là làm phẳng một Mảng tiềm năng, như:

# foo = [1]
foo = Array(foo).push(:element)
# => [1, :element]

Tôi không chắc nó sẽ luôn được đảm bảo trong Ruby foo = foođặt foothành nilkhi nào foolà không xác định. Ngoài ra, Kernel#Arraykhông làm phẳng foo. Nó chỉ trả về foonếu nó là một Mảng.
Eric Duminil 17/02/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.