2010-03-13 6 views

Répondre

5

Il suffit simplement de déléguer à chaque méthode sur @array et de lui passer le bloc. De plus, vous pouvez inclure le mélange dans Enumerable pour accéder aux méthodes disponibles (par exemple carte, injection, etc ...):

class Box 
    include Enumerable 

    def initialize 
    @array = [:foo, :bar] 
    end 

    def each(&block) 
    @array.each(&block) 
    end 
end 

Plus d'informations sur le module Enumerable est disponible in the documentation.

+0

Merci, Patrick! –

+0

+1 - C'est une solution assez décente. – RubyDubee

+0

La bibliothèque Forwardable est une autre façon de gérer la délégation simple: 'require 'forwardable'', puis à l'intérieur Box:' extend Forwardable' et 'def_delegator (: @ array,: each)' –

1

Pour cet exemple simple, vous êtes effectivement pas obligé de passer le bloc explicitement:

def each     
    @array.each{|e| yield e} 
end 

passage du bloc (qui est un Proc object) vous permet explicitement de tester pour des choses, comme le nombre d'arguments qu'il attend:

class Box 
    ...  
    def each(&block) 
    @array.each do |e| 
     case block.arity 
     when 0 
     yield 
     when 1 
     yield e 
     when 2 
     yield e, :baz 
     else 
     yield 
     end 
    end 
    end 
end 

a = Box.new 
a.each { puts "nothing" }    # displays "nothing, nothing" 
a.each { |e| puts e }     # displays "foo, bar" 
a.each { |e1, e2| puts "#{e1} #{e2}" } # displays "foo baz, bar baz" 
+0

Un grand merci, Nate. J'étudierai votre réponse ^^ –

Questions connexes