C und patch

A. Pagaltzis pagaltzis at gmx.de
Don Nov 21 02:35:02 CET 2002


* Josef 'Jupp' Schugt <jupp at gmx.de> [2002-11-21 01:15]:
> * A. Pagaltzis <pagaltzis at gmx.de> wrote:
> > Wie soll denn bei "2" == "2.0" verfahren werden?
> 
> Indem "2" und "2.0" als Objekte aufgefasst werden.

Darum geht es doch hier gar nicht. Zugrunde liegt nur die
Tatsache dass du die Stringform von der numerischen Form
unterscheiden musst. Ob nun mit strncmp, eq oder .to_s, du
kommst immer auf's prinzipiell gleiche Ergebnis dass du die
Semantik der konkreten Sprache zum Angeben des gewünschten
Vergleichstyps kennen musst.

> # 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";
> }

Kür haben wir auch.

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

# Numerischer Vergleich 1
if (int "2" == int "2.1") {
  print "Als Integers gleich\n";
} else {
  print "Als Integers ungleich\n";
}

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

Übrigens würde ich die unnötigen Blöcke und damit
verbundenen Einrückungen ankreiden.

> 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?

Wenn ich nicht aus der Lektüre wüsste, was rescue ist und
wozu to_* dienen, wäre ich vollkommen verwirrt. So habe ich
nach etwas über 15 Minuten Knobeln den unsicheren Eindruck,
es geht darum, Argumente nach Möglichkeit automatisch in
Zahlen oder Bools zu wandeln während sie gepusht werden.

Das erste was mir aufgefallen ist war die hübsche Bogenform
der verschachtelten Einrückungen. :-) Und als zweites die
vertikale Länge im Verhältnis zur Anzahl Tokens.

> 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

Übrigens wäre die Verrenkung in Perl gar nicht nötig, denn
dort sagt der Array-Benutzer beim Verwenden von Elementen
einfach == und braucht sich nicht mehr kümmern was
drinsteckt.

Dass Perl, wenn man versucht, Ruby in Perl zu schreiben,
nicht gut abschneidet, ist nicht weiter verwunderlich. :-)

Aber vielleicht bist du einfach eher ein Smalltalker während
ich mich am funktionalen Ende der Programmierung
wiederfinde. Dann wirst du mit Ruby glücklicher und ich mit
Perl. Ich andererseits finde die Perlsyntax, und dabei geht
es hauptsächlich um die Syntax des Zugriffs auf Variablen,
sehr sehr eingängig und logisch. (Sachen wie @array[@slice]
machen einfach Sinn.)

-- 
Gruss,
Aristoteles