Ruby: merkwürdiges Verhalten – ist das normal?

OP #7587434
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.

#7587442
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.

Persönliche Seite #7587476
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren