Створення або додавання до масиву в Ruby


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

Відчувається трохи незграбно. Чи є більш ідіоматичний спосіб?


11
Це є идиоматическим способом. Ви можете це зробити в один рядок (foo ||= []) << :element, але я вважаю це потворнішим.
Серхіо Туленцев

4
ІМО правильним способом є вихідні значення. Якщо у вас є || = і << для однієї і тієї ж змінної в рамках одного методу, ви маєте запах коду і вже зробили щось не так. Питання, як зробити || = << красиво, це просто робити косметику, а не вирішувати справжню проблему.
apeiros

Відповіді:


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

Але я. Невже так важко тримати його читабельним?


39
+1 за "Чи справді так важко тримати його читабельним?" Читаність - це цар.
Олов'яна людина,

Якщо fooсаме по собі є більш складним виразом, як (вкладений) хеш, в якому ви шукаєте значення, це хороший спосіб уникнути перегляду значень багаторазово або витратити іншу змінну для шуканого значення масиву.
sschuberth

60

Ви завжди можете використовувати метод push на будь-якому масиві. Мені це подобається більше.

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

10

Ви також можете отримати вигоду з масиву ядра # , наприклад:

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

що має перевагу згладжування потенційного масиву, наприклад:

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

Я не впевнений , що вона завжди буде гарантована в Ruby , який foo = fooвстановлює fooв nilколи fooне визначений. Крім того, Kernel#Arrayне сплющується foo. Він просто повертається, fooякщо це масив.
Ерік Думініл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.