什么样的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通常会用来创建一个数组,所以必须在这里做一些不同的事情。 从这个代码的上下文BTW, phrases变量可以是字符串或字符串数​​组。

它很可能是Kernel#Array方法,请参见此处 。 它与Array.new略有不同; 它更像是一个arrays。 (它尝试to_aryto_a 。)

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

@Brian是对的 – 它是一种内核方法。 Pickaxe说:

数组(arg) – > anArray

返回arg .to_a。

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

正如其他人已经说过的那样,这是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所有这些function允许您在一行中处理带参数的典型拐角情况。

请参阅此代码,这是许多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方法可能会或可能不会提供您所期望的。