[ruby-de] file descriptors

Marvin Gülker m-guelker at phoenixmail.de
Fr Apr 21 02:38:41 JST 2017


Hi,

On Thu, Apr 20, 2017 at 04:21:32PM +0200, Robert Klemme wrote:
> Eine OO-Lösung wäre eine Klasse mit der Schnittstelle von IO zu bauen,
> die dann in den Ausgabemethoden an mehrere IO-Instanzen delegiert.
> Sowas wie [...]

Ich finde, das geht noch etwas hübscher, wenn man method_missing
dazuzieht. Dabei entsteht dann ein Delegator für alle zugrundeliegenden
IO-Instanzen:

    class MultiIO

      def initialize(io1, *more_ios)
        @ios = [io1] + more_ios

        if block_given?
          begin
            yield(self)
          ensure
            @ios.each(&:close)
          end
        end
      end

      def method_missing(sym, *args, &block)
        if @ios.first.respond_to?(sym)
          @ios.map{|io| io.send(sym, *args, &block)}
        else
          super # raises NoMethodError
        end
      end
    end

    MultiIO.new(File.new("/tmp/file1.txt", "w"), File.new("/tmp/file2.txt", "w")) do |mf|
      mf.puts("Das ist in beiden Dateien")
    end

Das hat auch die gewohnte Blockform mit automatischen Schließen der
Dateien am Ende des Blocks. Da auch #to_io delegiert wird, kann dieses
Objekt zudem überall dort benutzt werden, wo unter Verwendung korrekten
Duck Typings ein IO erwartet wird.

Viele Grüße
Marvin

-- 
Blog: https://www.guelkerdev.de
PGP/GPG ID: F1D8799FBCC8BC4F


Mehr Informationen über die Mailingliste ruby-de