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?