Ruby: Introducing Super-Each

October 28th, 2006

Eine möglicherweise halbwegs sinnvolle Anwendung für den Proxy den ich hier vorgestellt habe.

Es wurmt mich manchmal, für das Aufrufen einer einzigen Methode in einem Enumerable dieses hässliche Klammerkonstrukt bemühen zu müssen:

Array#each{ |o| o.method }

Das geplante Symbol#to_proc sieht auch nicht viel besser aus:

%w[dsf fgdg fg].map(&:capitalize)  # =>  ["Dsf", "Fgdg", "Fg"]

Die Lösung:


    module Eachable

      class EachWrapper
        instance_methods.each do |m|  
          undef_method m unless m =~ /(^__|^nil\?|^send)/  
        end

        def initialize(args)  
          @target = args  
        end

        def method_missing (method, *args, &block)  
          @target.each do |elem|
            elem.send(method, *args, &block)
          end
        end

      end

      def supereach (*args, &block)
        if block_given?
          self.each(*args, &block)
        else
          return EachWrapper.new(self)
        end
      end

    end

    class Array
      include Eachable
    end

    chars = %w(a b c d)
    chars.supereach.upcase!
    puts chars.inspect   # => ["A", "B", "C", "D"]
 

Viel schöner.
Problem: das sollte nicht supereach, sondern each heissen. Das wird im moment noch verhindert:

  1. die Implementierung verwendet selbst each
  2. die Art wie Ruby das include Eachable verarbeitet, verhindert dass Array#each überschrieben wird.

Morgen, wenn meine Augen nicht mehr so schmerzen, finde ich eine Lösung.

Das klingt beeindruckend und ist die offizielle Bezeichnung der Projektgruppe die mich dieses und nächstes Semester beschäftigen wird.

Bei dem Projekt geht es darum, Methoden und Implementierungen zu entwickeln, die es Ingenieuren aus dem Maschinenbau erleichtern, Lösungsmengen heuristischer Algorithmen interaktiv zu untersuchen. Der Witz dabei ist, dass der Lösungsraum wesentlich mehr als 3 Dimensionen haben kann. Aufgabe der Projektgruppe ist es, sich zu überlegen, wie man einen solchen hochdimensionalen Lösungsraum vernünftig navigieren und betrachten kann und eine Implementierung dafür zu entwickeln.

Letzte Woche hatten wir unsere erste Zusammenkunft, eine zweitägige Seminarfahrt in der wir 11 uns gegenseitig über unsere jeweiligen Spezialgebiete informiert haben. Darüberhinaus war die gemeinsame Fahrt natürlich auch “teambildende Maßnahme”, allerdings hätte es einer solchen kaum bedurft: Ich denke dass wir da eine sehr gute Truppe zusammenbekommen haben.

Ich bin gespannt was die nächsten 2 Semester bringen werden.