【问题标题】:Ruby language feature of Set[1,2,3]Set[1,2,3] 的 Ruby 语言特性
【发布时间】:2013-01-09 01:17:45
【问题描述】:

在 Ruby 中,可以通过 Set[1,2,3] 来初始化一个集合 数组也可以:Array[1,2,3]

是否可以编写一些代码来对我自己的类做同样的事情? 或者它只是少数内置类的语言功能?

【问题讨论】:

  • 附带说明,Array[1, 2, 3] 将调用Array.[],但Array [1, 2, 3]y 后面有一个空格)将调用Kernel#Array
  • Avdi Grimm 在this comment 中将Kernel#Array 等方法描述为“转换函数”。

标签: ruby initialization language-features


【解决方案1】:

在 Ruby 中,foo[bar, baz] 只是 foo.[](bar, baz) 的语法糖。您只需要一个名为[] 的方法。

顺便说一句:您只需要查看文档,例如对于Set

[](*ary)

创建一个包含给定对象的新集合。

那是那里的文档。

基本上,你只需要

class Foo
  def self.[](*args, &block)
    new(*args, &block)
  end
end

【讨论】:

    【解决方案2】:

    是的,因为 [][]= 只是方法,它们可以被覆盖。

    你可以试试这样的:

    class MyArray
      attr_accessor :data
    
      def self.[](*values)
        obj = MyArray.new
        obj.data = values
        return obj
      end
    end
    

    【讨论】:

      【解决方案3】:
      class X
        attr_accessor :contents
      
        def self.[](*x)
          obj = self.new
          obj.contents = x
          obj
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2011-01-04
        • 2010-10-31
        • 2011-03-30
        • 2014-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多