How do I use the Enumerable mixin in my class?

前端 未结 2 1934
谎友^
谎友^ 2020-12-24 02:11

I have a class called Note, which includes an instance variable called time_spent. I want to be able to do something like this:

cur         


        
相关标签:
2条回答
  • 2020-12-24 02:28

    The Enumerable documentations says the following:

    The Enumerable mixin provides collection classes with several traversal and searching methods, and with the ability to sort. The class must provide a method each, which yields successive members of the collection. If Enumerable#max, #min, or #sort is used, the objects in the collection must also implement a meaningful <=> operator, as these methods rely on an ordering between members of the collection.

    This means implementing each on the collection. If you're interested in using #max, #min or #sort you should implement <=> on its members.

    See: Enumerable

    0 讨论(0)
  • 2020-12-24 02:37

    It's easy, just include the Enumerable module and define an each instance method, which more often than not will just use some other class's each method. Here's a really simplified example:

    class ATeam
      include Enumerable
    
      def initialize(*members)
        @members = members
      end
    
      def each(&block)
        @members.each do |member|
          block.call(member)
        end
        # or
        # @members.each(&block)
      end
    end
    
    ateam = ATeam.new("Face", "B.A. Barracus", "Murdoch", "Hannibal")
    #use any Enumerable method from here on
    p ateam.map(&:downcase)
    

    For further info, I recommend the following article: Ruby Enumerable Magic: The Basics.

    In the context of your question, if what you expose through an accessor already is a collection, you probably don't need to bother with including Enumerable.

    0 讨论(0)
提交回复
热议问题