2016-05-12 4 views
1

Beispielcode:Ruby - Singleton Modul mit jedem. Die Rückgabe eines Wertes ergibt einen Enumerator. Wie kann ich stattdessen den Wert erhalten?

module Creatures 
    class << self 
    def to_h 
     { 
      squirtle: {full_name: 'Squirtle T. Turtle'}, 
      pikachu: {full_name: 'Pikachu B. Pikachu'} 
     } 
    end 
    def keys 
     to_h.keys 
    end 
    def collect 
     to_h.keys.collect 
    end 
    def each 
     to_h.keys.each 
    end 
    end 
end 

module CompanionHelper 
    def get_companion_creature_experience(companion_data) 
    Creatures.each do |creature| 
     return companion_data[creature]["#{creature}_experience".to_sym] if companion_data.has_key?(creature) 
    end 
    end 
end 

include CompanionHelper 
companion_data = {squirtle: {squirtle_experience: 8000}} 

get_companion_creature_experience(companion_data) 

Verzeihen Sie mir, wenn das Beispiel gekünstelt ist. Der ursprüngliche Code ist von der Versicherungswelt, aber ich kann es nicht kopieren und einfügen :)

Der Kern des Problems ist, ich möchte Creatures.each in einem anderen Modul verwenden, es einen Block übergeben, und es funktioniert genauso wie Creatures.keys.each arbeiten (also würde ich w/dem gegebenen Beispiel Begleiter Daten 8000 für get_companion_creature_experience(companion_data) bekommen.

Derzeit erhalte ich Enumerator statt.

+1

sollten Sie berücksichtigen nur die Umsetzung 'each' und dann mit dem [Enumerable] (http://ruby-doc.org/core-2.3.1/Enumerable .html) Modul, das Ihnen "sammeln", "auswählen" und alle anderen Enumerable-Methoden kostenlos zur Verfügung stellen wird. –

+0

Ich habe 'include Enumerable' in den' class << self' Block eingefügt und es scheint großartig zu funktionieren. –

Antwort

3

Problem ist, dass to_h.keys.each kehrt Enumerator die keine Argumente erwarten. Übergeben Sie einen Block innerhalb each seit Sie möchten es verwenden:

def each &block 
    to_h.keys.each &block 
end 

Oder Sie können es ergeben:

def each 
    to_h.keys.each do |k| 
    yield k 
    end 
end 
+1

Das Entfernen der 'return' würde den Code brechen. –

+0

Das ist nicht korrekt. 'return' löst einen LocalJumpError aus, wenn er außerhalb einer Methodendefinition verwendet wird. –

+0

Danke @ Jordan und @Ilya. Ich benutze Ruby 1.9.3 und das 'return' funktioniert gut. Es war von einem anderen Coder mit einem anderen Stil, und ich ziehe es vor, es zu entfernen, wenn ich kann. Was genau passiert, wenn ich es tue ... Zum Glück habe ich es mit dem Pokemon-Beispiel versucht, bevor ich es in meinen Code bei der Arbeit setzte. Es gibt ein anderes Ergebnis .... ([: squirtle,: pikachu] statt 8000) –

Verwandte Themen