什么样的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_ary
和to_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_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
所有这些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
方法可能会或可能不会提供您所期望的。