Какой тип вызова метода ruby ​​является Array (x)

В чем смысл и где находится документация по 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переменная может быть либо строкой, либо массивом строк.

10.12.2008 23:53:31
3 ОТВЕТА
РЕШЕНИЕ

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

13
11.12.2008 00:13:25

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

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

Array (arg) -> anArray

Возвращает arg .to_a.

Array(1..5)  » [1, 2, 3, 4, 5]  
2
11.12.2008 00:17:59

Это 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
23.10.2012 09:32:09