Diverse Ruby-Features

Bibliotheken einbinden

Bibliotheken werden mit der Anweisung require, gefolgt von dem Namen der Bibliothek in Anführungszeichen, eingebunden. Für den konstruierten Fall, dass ein Wirtschaftsinformatik-Student der FH Wedel in einer Informatik-Seminar-Ausarbeitung über ruby eine Datei vergessen hat, könnte er die Bibliothek ftools verwenden, um seine Dateien umzubenennen:

>> require "ftools"
=> true
>> 5.downto(1) {|i| File.mv("ruby#{i}.htm", "ruby#{i+1}.htm") }
=> 5

Marshaling

Unter marshaling versteht man in ruby die Konvertierung von Ruby-Objekten in einen Bytestrom, so dass diese außerhalb der aktiven Instanz verwendet oder gespeichert werden können (entspricht implements serializable in Java).

class X
"   attr_reader (:x)
  def initialize (x)
  @x=x
  end
end

a=X.new ("HSV")
b=Marshal.dump(a)
c=Marshal.load(b)
puts c.x

Threads

Threads werden ganz einfach über den Konstruktor Threads.new erstellt. Dem Konstruktor muss dabei ein Block übergeben werden, der die Auszuführenden Anweisungen enthält (zur Erinnerung werden hier noch einmal beide Block-Schreibweisen benutzt):

count=0
t1=Thread.new do
  1.upto (23) do
    x = rand (100)
    puts "Thread1: #{count+=x}"
    sleep (x/100.0)
  end
end

t2=Thread.new {
  1.upto(23) {
    y = rand (100)
    puts "Thread2: #{count-=y}"
    sleep (y/100.0)
  }
}

t1.join
t2.join

Client-Server Anwendungen

Mit Hilfe der Distributed Ruby library (drb) lassen sich Client-Server Anwendungen sehr einfach realisieren. Für die Übergabe von Daten kann das oben beschriebene marshaling verwendet werden. Im folgenden Beispiel ist dies aufgrund akuter Trivialität nicht notwendig.

Das Server-Skript:

require "drb"

class TestServer
  attr(:serverAttr, true)
  def initialize
    @serverAttr="Hallo, Fremder!"
  end
end

aServerObject = TestServer.new
DRb.start_service("druby://localhost:9000", aServerObject)
DRb.thread.join>> require "ftools"

Das Client-Skript:

require "drb"
DRb.start_service()
a = DRbObject.new(nil, "druby://localhost:9000")

puts a.serverAttr
a.serverAttr="Auf Wiedersehen, Fremder!"
puts a.serverAttr

Fehlerbehandlung mit Exceptions

Ruby stellt eine Ausnahmen-Hierarchie zur Verfügung, die die Fehlerbehandlung in Ruby-Skripten recht einfach macht. Den Aufbau einer Ausnahme-Behandlung zeigt das folgende Beispiel:

f = File.open("testfile")
begin
  # ... Kritische Anweisungen
rescue
  # ... Behandlung eventueller Fehler
else
  # ... Anweisungen, die bei erfolgreicher Ausführung zusätzlich ausgeführt werden sollen
ensure
  f.close unless f.nil?
end