Приведение скаляра или массива в массив - PullRequest
10 голосов
/ 11 марта 2012

Иногда я хочу, чтобы переменная всегда была массивом, будь то скаляр или уже массив.

Так я обычно делаю:

[variable].flatten

, который совместим с ruby-1.8.5, 1.8.7, 1.9.x.

При использовании этого метода, когда variable является строкой (variable = "asdf"), он дает мне ["asdf"].Если это уже массив (variable = ["asdf","bvcx"]), он дает мне: ["asdf","bvcx"].

У кого-нибудь есть лучший способ?«Лучше» означает более читабельный, более производительный, сжатый или более эффективный в других отношениях.

Ответы [ 3 ]

15 голосов
/ 11 марта 2012
Array(variable)

должен сделать свое дело.Он использует малоизвестный метод Kernel # Array .

13 голосов
/ 11 марта 2012

То, что я делаю и считаю стандартным, использует [*...]:

variable1 = "string"
variable2 = ["element1", "element2"]

[*variable1] #=> ["string"]
[*variable2] #=> ["element1", "element2"]
0 голосов
/ 23 июля 2016

Вам может понадобиться что-то вроде Array.eat.Большинство других методов вызывают #to_a или #to_ary объекта.Если вы используете [ obj ].flatten, это может дать удивительные результаты.#flatten также будет искажать вложенные массивы, если не вызывается с параметром уровня, и создает дополнительную копию массива.

Активная поддержка обеспечивает Array.wrap, но это также вызывает #to_ary, что может или не можетбыть вам по вкусу, в зависимости от ваших потребностей.

require 'active_support/core_ext/array/wrap'

class Array

# Coerce an object to be an array. Any object that is not an array will become
# a single element array with object at index 0.
#
# coercing nil returns an empty array.
#
def self.eat( object )

  object.nil?              and return []
  object.kind_of?( Array ) and return object

  [object]

end

end # class Array

a = { a: 3 }

p [a].flatten        # => [{:a=>3}]
p [*a]               # => [[:a, 3]] -> OOPS 
p Array      a       # => [[:a, 3]] -> OOPS
p Array.wrap a       # => [{:a=>3}]
p Array.eat  a       # => [{:a=>3}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...