Как убедиться, что метод возвращает массив, даже если в Ruby есть только один элемент - PullRequest
3 голосов
/ 19 марта 2010

У меня есть метод Ruby, который ищет массив хэшей и возвращает подмножество этого массива.

  def last_actions(type = 'all')
    actions = @actions

    if type == 'run'
      actions = actions.select {|a| a['type'] == "run" }
    end

    return actions

  end

Это работает, за исключением случаев, когда нужно вернуть только одно действие, в этом случае я не делаю 'Не думаю, что он возвращает массив с одним элементом, а только с самим элементом.Это становится проблематичным позже.

Какой хороший способ гарантировать, что в этом случае он возвращает массив из 1 элемента?

Спасибо.

Ответы [ 4 ]

14 голосов
/ 20 марта 2010

Обратите внимание, что есть хорошая чистая рубиновая идиома, позволяющая обрабатывать отдельные объекты и массивы как массивы:

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

[*a]
=> [1, 2, 3]

[*b]
=> [4]
2 голосов
/ 19 марта 2010

select всегда возвращает массив (кроме случаев, когда вы break внутри блока, чего нет). Так что, если что-то идет не так в вашем коде, это не причина.

Конечно, если @actions не содержит массив (или другой тип Enumerable), вызов select вызовет исключение, и метод вообще ничего не вернет. Решением в этом случае было бы убедиться, что @actions всегда возвращает массив. Как это сделать, зависит от того, где / как вы установили @actions.

1 голос
/ 17 апреля 2012

Вы также можете сделать это так:

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

Array(a)
=> [1, 2, 3]

Array(b)
=> [4]
1 голос
/ 19 марта 2010

Ваше наблюдение более чем странно, однако вы можете попробовать это:

def last_actions(type = 'all')
  actions = @actions.dup || []
  actions.delete_if {|a| a['type'] != "run" } if type == 'run'
  actions
end
...