【问题标题】:What kind of ruby method call is Array(x)Array(x) 是哪种ruby方法调用
【发布时间】:2010-09-26 08:40:07
【问题描述】:

是什么意思,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 变量可以是字符串或字符串数​​组。

【问题讨论】:

    标签: ruby-on-rails ruby arrays


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      @Brian 是对的——它是内核的一种方法。镐说:

      Array(arg) -> anArray

      返回 arg .to_a。

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

      【讨论】:

        【解决方案3】:

        正如其他人已经说过的那样,这是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 方法可能会或可能不会提供您所期望的。

        【讨论】:

          猜你喜欢
          • 2021-03-04
          • 2015-11-30
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          • 2022-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多