什么样的ruby方法调用是Array(x)

时间:2008-12-10 23:53:32

标签: ruby-on-rails ruby arrays

是什么意思,以及语法的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 个答案:

答案 0 :(得分:13)

最有可能是Kernel#Array方法,请参阅here。它与Array.new略有不同;它更像是一个阵列。 (它会尝试to_aryto_a。)

答案 1 :(得分:2)

Array(x)似乎与x.to_a完全相同。

@Brian是对的 - 这是一种内核方法。 Pickaxe说:

数组(arg) - > anArray

返回arg .to_a。

Array(1..5)  » [1, 2, 3, 4, 5]  

答案 2 :(得分:2)

这是Kernel#Array方法,正如其他人已经说过的那样。

但Ruby文档并没有说明这种方法在简化代码方面的用处。此外,它没有告诉您没有to_aryto_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方法可能会或可能不会提供您期望的内容。