【问题标题】:Chaining methods in a custom class that return objects of a superclass自定义类中返回超类对象的链接方法
【发布时间】:2015-11-01 12:44:11
【问题描述】:

我有以下类定义

class Map < Array

def find_all_activerecord
  self.find_all { |element| element.class.superclass == ActiveRecord::Base }
end

def find_all_family_nil
  find_all { |element| element.try(:family) == nil }
end

def find_all_parents
  self.find_all_activerecord.find_all_family_nil
end

end

我可以做到以下几点

@map = Map.new
@map.find_all_activerecord
@map.find_all_family_nil

但是当我尝试时

@map.find_all_parents

我在 []:Array 上收到未定义方法“find_all_family_nil”的错误

我明白发生了什么。自定义方法返回数组对象,该方法在 Class::Map 上定义

如何在自定义类上创建自定义方法,这些方法可能返回更高类的对象,但又能够将它们链接起来


我遇到的另一个问题是 换班 如果

   @map = Map.new

然后

   @map = @map + [1,2,3]

   @map.class # => Array

为什么会发生这种情况应该做什么以及这是什么研究领域

【问题讨论】:

    标签: ruby class object methods chaining


    【解决方案1】:

    您可能已经想到,您的 find_all 方法在应该返回 Map 对象时返回了 Array 对象。

    我能想到的一个解决方法是:

    class Map < Array
      def find_all(&block)
        self.class.new(super(&block))
      end
    end
    

    【讨论】:

    • +1。包装它并使其可组合的最佳方法是简单地返回使用您继承的复制构造函数创建的新 Map。
    • @IlyaO。您能否详细说明复制构造函数以及包装的含义以及更改类的扩展问题
    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2013-05-18
    相关资源
    最近更新 更多