Dopoki nie zdefiniujecie czym jest parametr to mozecie sobie tak gadac i gadac. Jak ktos sie spyta jak jest przekazywany parametr, majac na mysli obiekt podawany do metody, to rownie dobrze mozna odpowiedziec, ze w ogole nie jest przekazywany:-P I tak w rzeczywistosci jest;-)
To może od razu zdefiniujmy co to jest język programowania? Nie róbcie sobie żartów. Ok, jeśli nie przekonują Was moje argumenty to może chociaż jesteście w stanie przeboleć to co podaje wiki (a przyznam, że zaglądnąłem tam dopiero przed chwilą):
Ruby ma dokładnie taki sam model jak java.
Czyli dokładnie tak jak pisałem.
Niżej wytłumaczone, że ruby/java używają “Call_by_sharing”, które jest specjalną nazwą na “call by value”, gdzie value jest referencją.
radarek, z definiowaniem parametru miałem na myśli coś innego. Jak ktoś ma metodę, której podaje -parametr- {:foo => ‘bar’} to NIE JEST on przekazywany przez wartość tak jak na początku napisałeś! Mogę go przecież zmodyfikować w metodzie, więc WTF? Jak to przez wartość? To jest kwestia implemetacji, że Java albo Ruby tak na prawde zamiast kopiowania obiektu kopiuje tylko jego referencję i to jest traktowane jako -parametr-. Nikt przecież nie próbuje Ci wmówić, że to się odbywa przez referencję, bo wiemy, że tak nie jest. Mi osobiście chodzi tylko o to, że krótkie powiedzienie ‘przez wartość’, zakładając sobie w myśli, że nie chodzi o obiekt tylko o referencję do niego, nie jest w porządku kiedy chce się komuś wyjaśnić istotę problemu.
ppicanfly, Twoje rozumowanie o tyle nie ma sensu, że wychodzisz ze złego założenia. Ruby przekazuje przez wartość to co trzyma w zmiennej. A co trzyma w zmiennej? (pytam już 3 raz) Ano trzyma referencję.
Natomiast 100% zgoda w kwestii tego, że mówiąc iż przekazywana jest wartość powinno się dodać, że jest referencją do obiektu. Jednak stwierdzenie bez tego dopisku jest ciągle prawdą, w przeciwieństwie do kompletnie błędnego “Bo w rubym zmienne są przekazywane właśnie przez referencję.”, a od tego dla mnie zaczęła się dyskusja.
radarek, chłopie! Ruby przekazuje parametry metodom w ten sam sposób co Java w przypadku obiektów. Tak? Tak. Czyli skoro mówimy w przypadku Javy o przekazywaniu parametrów przez referencję, mówmy i tak samo w Rubym.
W Javie, w przypadku typów prostych, mówimy o przekazywaniu ich przez wartość. W Rubym nie mamy typów prostych, nie mamy też przekazywania parametrów przez wartość.
To jest aż tak proste, a mówienie o przekazywaniu obiektu przez referencję a wartości zmiennej przez wartość na raz to jakieś bezeceństwo.
def metoda(obiekt); obiekt.object_id; end
a = "hello"
a.object_id
=> 22108760
metoda(a)
=> 22108760
A kto powiedział, że java przekazuje parametry przez referencje? Co, na studiach tak Cię uczyli to powtarzasz?
Przeczytajcie sobie lepiej http://en.wikipedia.org/wiki/Evaluation_strategy bo mi się z Wami już nie chce polemizować.
Zrozumcie, że fakt iż w zmiennych są trzymane referencje do obiektów nie implikuje iż przekazanie ich jako parametr jest przekazaniem przez referencje (nawet jeśli obiekt nie jest cały kopiowany). Kopiowane jest to co jest trzymane w zmiennej, czyli referencja.
Nic takiego nie twierdziłem. Pisałem, że zmienne są przekazywane przez wartość. A to, że nie potraficie zrozumieć co jest wartością zmiennej (nie, nie jest nią obiekt) to już Wasz problem.
OK, poczytałem sobie na Internecie i ja tutaj widzę niezły burdel. Faktycznie nazywanie przekazywania parametrów przez wartość czy referencję to niewystarczające sformułowania do opisania wszystkich możliwych przypadków. Literatura odnośnie Javy mówi jednak często o przekazywaniu przez referencję, stąd moje przeświadczenie że jest to poprawna nazwa, biorąc pod uwagę analogiczne zachowanie.
Polecam lekturę http://en.wikipedia.org/wiki/Evaluation_strategy. Metoda użyta w języku Ruby (jak i w Javie) nazywana jest tu “call by sharing”. Ktoś wie jak jest to tłumaczone na język polski?
właśnie dogrzebałem się do tego źródła :).
Hubert, przeczytaj całość. Jest tam napisane, że java przekazuje tak na prawdę przez wartość (call-by-value), ale ponieważ wartością jest referencja więc to jest trochę mylące (jak widać po tym wątku…) więc wymyślili osobne pojęcie call-by-sharing. Jednak tak jak pisałem jest to specjalny przypadek przekazania przez wartość.
Zgadzam się w 100% i już milknę.
Żeby tak inni potrafili się przyznać do błędu oraz zrozumieć te proste rzeczy jakie im się wykłada na tacy to by było fajnie ;-).