Forum: PC-Programmierung Ruby: merkwürdiges Verhalten – ist das normal?


von Moriz (untertaucher)


Lesenswert?

Ich benutze Ruby 3.2.2

Folgende Codesequenz:
1
cmd = clss = ''      # Die variablen sollen auf leeren String gesetzt werden
2
cmd << 'checked '
3
p clss

Als Ausgabe würde ich "" erwarten – dem ist aber nicht so:
Das Ergebnis ist "checked "

Ändert man sie Sequenz in
1
cmd = clss = ''      # Die variablen sollen auf leeren String gesetzt werden
2
cmd = 'checked '
3
p clss

kommt das erwartete Ergebnis "".

Frage: ist das ein Bug, oder ein Feature?

Nachtrag: wenn man statt << += verwendet, dann passiert das nicht.

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Das '<<' fügt an einen String an. cmd zeigt auf das selbe String-Objekt 
wie clss. Wenn du also cmd veränderst, ändert sich clss ebenso.

Moriz schrieb:
> kommt das erwartete Ergebnis "".

Weil du dann cmd nicht veränderst, sondern auf ein neues String-Objekt 
setzt. clss zeigt weiterhin auf den alten, leeren String.

von Hendrik L. (hlipka)


Lesenswert?

Der Code macht nicht dass was Du erwartest.
1
a=b=''
sorgt dafür das 'a' und 'b' auf das gleiche Objekt zeigen. Wenn Du jetzt 
per "a << 'x'" den String länger machst, betrifft das auch die Referenz 
über 'b' - sie zeigt ja auf das gleiche Objekt.
Hingegen weisst "a='x'" 'a' ein neues Objekt zu, und 'b' zeigt immer 
noch auf das alte. Da ein "a+='x'" nur eine Abkürzung für a=a+'x'" ist, 
verhält es sich genauso.

: Bearbeitet durch User
von Moriz (untertaucher)


Lesenswert?

Niklas G. schrieb:
> Das '<<' fügt an einen String an. cmd zeigt auf das selbe String-Objekt
> wie clss. Wenn du also cmd veränderst, ändert sich clss ebenso.

Erklären kann ich mir das schon, aber das war nicht die Frage.

Wenn ich mir in der Beschreibung der class String #<< ansehe, dann ist 
dieses Verhalten doch etwas überraschend.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Moriz schrieb:
> Wenn ich mir in der Beschreibung der class String #<< ansehe, dann ist
> dieses Verhalten doch etwas überraschend.

Ja, es ist nicht besonders toll dokumentiert:

> Concatenates object to self and returns self:

Returns `self' ist hier der Knackpunkt - es wird kein neuer String 
angelegt, sondern eben der eigene aktuelle modifizierte String 
zurückgegeben.

von Moriz (untertaucher)


Lesenswert?

Niklas G. schrieb:
> Ja, es ist nicht besonders toll dokumentiert:

Das ist ein großes Problem bei Ruby: das ganze rubydoc-Zeug ist ziemlich 
nutzlos, wenn man irgend was neues eruieren will.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.