[ruby-de] lokale Werte ändern

sto.mar at web.de sto.mar at web.de
Mi Apr 19 06:14:13 JST 2017


Am 18.04.2017 um 19:33 schrieb Die Optimisten:
> Hallo!
>
> a=[1,2,3]
> a.each { |x| x=x+10 }    # warum nicht [11, 12, 13] ?!

Hallo,

Bitte gib in der Frage auch den tatsächlichen (IRB-)Output mit an,
z.B. so:

a = [1, 2, 3]
a.each {|x| x=x+10 }   # => [1, 2, 3]

Das macht es leichter für die, die die Frage beantworten sollen/wollen,
und erhöht damit die Wahrscheinlichkeit, eine Antwort zu bekommen.

> Warum geht das nicht, es wird ja das x, das den jeweiligen Wert enthält,
> verändert!
> - Wann wird by_value, wann by_reference übergeben?!

Siehe z.B. https://www.ruby-lang.org/en/documentation/faq/4/,
unter "Does assignment generate a new copy of an object?" und
"How are arguments passed?".

Zwei Aspekte sind hier relevant:

1. die Zuweisung `x = ...' bewirkt, dass die lokale Variable x
nicht mehr auf das Array-Element verweist, sondern auf ein neues,
anderes Objekt, nämlich das auf der rechten Seite konstruierte.

2. bei Zahlen handelt es sich um "immediate values"; dann enthält
x sowieso keine Referenz, sondern direkt den entsprechenden Wert.

Folgendes geht:

a = ["1", "2", "3"]
a.each {|x| x << "!" }  # => ["1!", "2!", "3!"]


Aber was du vermutlich eigentlich wolltest, ist #map und nicht #each:

a = [1, 2, 3]
b = a.map {|x| x+10 }  # => [11, 12, 13]

Grüße,
Marcus


-- 
GitHub: https://github.com/stomar/
PGP:    0x6B3A101A


Mehr Informationen über die Mailingliste ruby-de