Ruby ditafsirkan. Variabel adalah referensi ke data, tetapi bukan data itu sendiri. Ini memfasilitasi menggunakan variabel yang sama untuk data dari berbagai jenis.
Penugasan lhs = rhs kemudian menyalin referensi pada rhs, bukan data. Ini berbeda dalam bahasa lain, seperti C, di mana tugas tidak menyalin data ke lhs dari rhs.
Jadi untuk pemanggilan fungsi, variabel yang dikirimkan, misalkan x, memang disalin ke variabel lokal dalam fungsi, tetapi x adalah referensi. Kemudian akan ada dua salinan referensi, keduanya merujuk data yang sama. Satu akan berada di pemanggil, satu di fungsi.
Tugas dalam fungsi kemudian akan menyalin referensi baru ke versi fungsi x. Setelah ini, versi x penelepon tetap tidak berubah. Itu masih referensi ke data asli.
Sebaliknya, menggunakan metode .replace pada x akan menyebabkan ruby melakukan salinan data. Jika ganti digunakan sebelum penugasan baru maka penelepon memang akan melihat perubahan data dalam versinya juga.
Demikian pula, selama referensi asli sesuai dengan variabel yang diteruskan, variabel instan akan sama dengan yang dilihat pemanggil. Dalam kerangka suatu objek, variabel instan selalu memiliki nilai referensi yang paling terkini, baik yang disediakan oleh pemanggil atau diatur dalam fungsi kelas yang diteruskan.
'Panggilan berdasarkan nilai' atau 'panggilan dengan referensi' kacau di sini karena kebingungan mengenai '=' Dalam bahasa yang dikompilasi '=' adalah salinan data. Di sini, dalam bahasa yang ditafsirkan ini '=' adalah salinan referensi. Dalam contoh Anda memiliki referensi yang diteruskan diikuti oleh salinan referensi meskipun '=' yang clobbers yang asli lulus dalam referensi, dan kemudian orang-orang membicarakannya seolah-olah '=' adalah salinan data.
Agar konsisten dengan definisi, kita harus tetap menggunakan '.replace' karena ini adalah salinan data. Dari perspektif '. Ganti' kita melihat bahwa ini memang lulus dengan referensi. Lebih jauh, jika kita berjalan di debugger, kita melihat referensi dilewatkan, karena variabel adalah referensi.
Namun jika kita harus menjaga '=' sebagai kerangka referensi, maka memang kita bisa melihat data yang diteruskan hingga tugas, dan kemudian kita tidak bisa melihatnya lagi setelah penugasan sementara data pemanggil tetap tidak berubah. Pada tingkat perilaku, ini dilewati oleh nilai selama kami tidak menganggap nilai yang diteruskan sebagai komposit - karena kami tidak akan dapat menyimpan bagian darinya sambil mengubah bagian lainnya dalam satu tugas tunggal (karena tugas itu mengubah referensi dan yang asli keluar dari ruang lingkup). Juga akan ada kutil, dalam hal variabel variabel dalam objek akan menjadi referensi, seperti semua variabel. Karenanya kita akan dipaksa untuk berbicara tentang melewati 'referensi berdasarkan nilai' dan harus menggunakan lokasi terkait.