C und patch

Josef 'Jupp' Schugt jupp at gmx.de
Mit Nov 20 16:45:57 CET 2002


* On 2002-11-20 13:24
* A. Pagaltzis <pagaltzis at gmx.de> wrote:
>> Ich habe zwei Zeichenketten mit '==' verglichen und mich
>> über das absonderliche Ergebnis gewundert. Bis mir
>> einfiel, dass in diesem Fall 'eq' nötig war.
> 
> Das ist ja auch zwingend so. Wie soll denn bei "2" == "2.0"
> verfahren werden?

Indem "2" und "2.0" als Objekte aufgefasst werden. Meiner Meinung
lässt sich die von Ruby verwendete Lösung des Problems kaum noch
verbessern:

#####################################################################
#
# Beispiel dafür, wie Objekte den Programmieralltag erleichtern
# können und zu leicht lesbaren Programmen führen.
#
#####################################################################

# RUBY, Pflicht:

if ("2" == "2.0")
  puts "Variante 1: gleich";
else
  puts "Variante 1: ungleich";
end

# to_f(loat)
if ("2".to_f == "2.0".to_f)
  puts "Variante 2: gleich"
else
  puts "Variante 2: ungleich"
end

# RUBY, Kür:

if ("2" == "2.1")
  puts "Variante 3: gleich";
else
  puts "Variante 3: ungleich";
end

# to_i(nt)
if ("2".to_i == "2.1".to_i)
  puts "Variante 4: gleich"
else
  puts "Variante 4: ungleich"
end

# to_f(loat)
if ("2".to_f == "2.1".to_f)
  puts "Variante 5: gleich"
else
  puts "Variante 5: ungleich"
end
#####################################################################

Hier die Ausgaben:

Variante 1: ungleich
Variante 2: gleich
Variante 3: ungleich
Variante 4: gleich
Variante 5: ungleich

Und nun Perl:

# Vergleich als Zeichenfolgen 
if ("2" eq "2.0") {
  print "Als Zeichenfolgen gleich\n";
} else {
  print "Als Zeichenfolgen ungleich\n";
}

# Numerischer Vergleich 
if ("2" == "2.0") {
  print "Als Zahlen gleich\n";
} else {
  print "Als Zahlen ungleich\n";
}

mit den Ausgaben

Als Zeichenfolgen ungleich
Als Zahlen gleich

Ich überlasse es dem Einzelnen, sich eine Meinung zu bilden. Für mich
war genau dieses Problem mit ausschlaggebend dafür, dass ich mich von
Perl abgewendet habe.

Die Klasse 'Array' enthält eine Methode 'push', mit der ein Objekt am
Ende eines Arrays angehängt wird. Ich leite eine Klasse von 'Array'
ab und definiere die nachfolgend wiedergegebene Methode, der Strings
übergeben werden. 'super' ruft die Methode 'push' der Klasse 'Array'
mit dem angegebenen Argument auf. Frage: Kann man auch ohne Ruby-
Kenntnisse erkennen, welchen Sinn diese Definition hat?

def push(x)
  begin
    Float(x)
  rescue ArgumentError
    begin
      Integer(x)
    rescue ArgumentError
      if x == 'false'
        super(false)
      elsif x == 'true'
        super(true)
      else
        super(x)
      end
    else
      super(x.to_i)
    end
  else
    super(x.to_f)
  end
end

Genug Werbung für heute :-)

Josef 'Jupp' Schugt <jupp at gmx.de>                 http://jupp.tux.nu/
-- 
Meckenheimer Str. 66a, 53179 Bonn, DE/EU             +49 228 34 24 85
I was deeply shocked by learning that a Windows XP Pro Recovery CD at
39,- EUR is a pirated copy. Does this mean that my Linux distribution
which did cost less and has more features is a pirated copy as well?