Какой тип вызова метода ruby ​​является Array (x) - PullRequest
4 голосов
/ 11 декабря 2008

В чем смысл и где находится документация Ruby для синтаксиса:

Array(phrases)

, который я нашел, просматривая источник Rails здесь:

# File actionpack/lib/action_view/helpers/text_helper.rb, line 109
...
119:           match = Array(phrases).map { |p| Regexp.escape(p) }.join('|')

Я думал, что Array.new обычно используется для создания массива, поэтому здесь должно происходить что-то другое. Кстати, из контекста этого кода переменная phrases может быть либо строкой, либо массивом строк.

Ответы [ 3 ]

13 голосов
/ 11 декабря 2008

Скорее всего, это метод Kernel#Array, см. здесь . Это немного отличается от Array.new; это скорее бросок в массив. (Он пытается to_ary и to_a.)

2 голосов
/ 23 октября 2012

Это метод Kernel#Array, как уже говорили другие.

Но документация по Ruby не учитывает полезность этого метода для упрощения вашего кода. Также это не говорит о том, что объекты, у которых нет метода to_ary или to_a, инкапсулированы в массиве.

Array([1,2,3])        -> [1,2,3]
Array(1..3)           -> [1,2,3]
Array({ a: 1, b: 2 }) -> [[:a, 1],[:b,2]]
Array("Hello World")  -> ["Hello World"]
Array(1)              -> [1]

Все эти функции Kernel#Array позволяют обрабатывать типичные угловые случаи с параметрами в одной строке.

См. Этот код, который является типичной ситуацией во многих API или DSL:

# data can be nil, a single value or an array
def handle(data)
  data ||= Array.new   #Case 1: Data is nil
  data = [data] unless data.is_a?(Array)   #Case 2: Data is a single value
  data.each { |d| ... }
end

Это можно упростить с помощью Kernel#Array:

def handle(data)
  Array(data).each { |d| ... }
end

Конечно, нужно быть осторожным с предоставлением различных типов для параметра data, потому что методы to_ary / to_a могут дать или не дать вам то, что вы ожидаете.

2 голосов
/ 11 декабря 2008

Массив (x) действует точно так же, как x.to_a.

@ Брайан прав - это метод Кернел. Кирка говорит:

Array (arg) -> anArray

Возвращает аргумент .to_a.

Array(1..5)  » [1, 2, 3, 4, 5]  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...