Как бы вы реализовали эту идиому в ruby? - PullRequest
4 голосов
/ 28 января 2011

Как человек, который пришел из Java и был новичком в Ruby, мне было интересно, есть ли простой способ сделать это с помощью ruby.

new_values = foo(bar)
if new_values
  if arr
    arr << new_values
  else 
    arr = new_values
  end
end

Ответы [ 5 ]

7 голосов
/ 28 января 2011

Предполагая, что "arr" - это либо массив, либо nil, я бы использовал:

arr ||= []
arr << new_values

Если вы делаете это в цикле или чем-то подобном, возможно, есть более идиоматические способы сделать это. Например, если вы перебираете список, передаете каждое значение в foo() и создаете массив результатов, вы можете просто использовать:

arr = bars.map {|bar| foo(bar) }
3 голосов
/ 28 января 2011

arr = [*arr.to_a + [*new_values.to_a]]


Начните с:

arr ||= []

И затем, в зависимости от того, является ли new_values массивом или нет

arr += new_values    # if array
arr << new_values    # if not
arr += [*new_values] # if it could be either

Кроме того, вы можете избавиться от теста на new_values, воспользовавшись тем, что NilClass реализует метод .to_a => [] и сократив все до:

arry ||= []
arr += [*new_values.to_a]

Но подождите, мы можем использовать этообмануть снова и превратить все это в однострочник:


arr = [*arr.to_a + [*new_values.to_a]]

3 голосов
/ 28 января 2011

Если я вас правильно понимаю, я бы, вероятно, сделал:

# Start with an empty array if it hasn't already been set
@arr ||= []

# Add the values to the array as elements
@arr.concat foo(bar)

Если вы используете @arr << values, вы добавляете весь массив значений в конец массива как одну вложенную запись.

1 голос
/ 28 января 2011

Я не собираюсь писать необъяснимый однострочный, но я думаю, что это совершенно ясно.Предполагая, как Phrogz, что вам действительно нужно это расширение (concat):

arr = (arr || []).concat(foo(bar) || [])

или:

(arr ||= []).concat(foo(bar) || [])
0 голосов
/ 28 января 2011

Я бы использовал:

new_values = foo(bar)
arr ||= []
arr << new_values if new_values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...