Ikutan nimbrung ah, kebetulan saya juga masih baru di ruby dan punya
background C :)
On 5/23/07, Yohanes Santoso <[EMAIL PROTECTED]> wrote:
>
> "julius sirait" <[EMAIL PROTECTED]> writes:
>
> > yang pertama ketika x1 diubah, x2 gak ikut berubah. kalau background
> > programmer C, dia pasti bayangkan x1 dan x2 sebagai value. karna kalau
> > sebagai reference, x2 harusnya ikut berubah. nah gimana menjelaskan
> > ini ke programmer C dengan bahasa awam?
>
> Jelaskan bahwa rule buat variable binding sama saja sama di C: tiap2x
> binding independent sama yang lainnya.
Menurut saya, kita dapat berpegang pada aturan bahwa segalanya adalah
objek di ruby, variable sebagai reference ke objek, dan proses
assignment adalah proses meng-copy reference.
Jadi jika kita trace code dari saudara Julius Sirait, proses-nya
kira2x seperti ini:
irb(main):001:0> x1 = 100 -> variable x1 berisi reference ke objek 100
irb(main):002:0> x2 = x1 -> variable x2 berisi reference ke objek yg
sama dgn variable x1
irb(main):003:0> x1 = 200 -> variable x1 skrg berisi reference ke objek 200
irb(main):004:0> x1
=> 200 -> variable x1 menunjuk ke objek 200
irb(main):005:0> x2
=> 100 -> variable x2 masih menunjuk ke objek 100
nilai x1 dan x2 berbeda karena reference pada variable x1 telah
berubah dari objek 100 ke objek 200.
Sedangkan pada kode dari saudara Widi Harsojo (baris ke 3), yang
terjadi adalah perubahan pada isi dari objek yang sama2x ditunjuk oleh
ar dan ar2. Makanya ketika dicetak nilai variable ar dan ar2 tetap
sama, karena memang masih menunjuk ke variable yang sama. Baru setelah
baris ke 10 nilai ar dan ar2 berbeda, karena keduanya sudah menunjuk
ke variable yg beda.
>
>
>
>
>
> #include <stdio.h>
> int main(void)
> {
> int x1 = 100; int x2 = x1;
> printf("x1=%d\nx2=%d\n", x1, x2);
> x1=200;
> printf("x1=%d\nx2=%d\n", x1, x2);
> return 0;
> }
>
> /tmp $ make varbind
> cc varbind.c -o varbind
> /tmp $ ./varbind
> x1=100
> x2=100
> x1=200
> x2=100
>
> hasil yang sama, dan tidak seperti C++:
>
> #include <iostream>
> using namespace std;
> int main()
> {
> int x1 = 100;
> int &x2 = x1;
> cout << "x1=" << x1 << endl << "x2=" << x2 << endl;
> x1=200;
> cout << "x1=" << x1 << endl << "x2=" << x2 << endl;
> return 0;
> }
> /tmp $ make cpp-varbind && ./cpp-varbind
> g++ cpp-varbind.cpp -o cpp-varbind
> x1=100
> x2=100
> x1=200
> x2=200
>
> YS.
>
Hasilnya jelas berbeda, karena code-nya juga beda :). Pada code c++ x2
adalah reference, yang diset menunjuk ke x1, sedangkan x1 bukan
reference. Maka ketika x1 berubah, nilainya langsung tercermin pada
x2. Mungkin akan lebih mudah dipahami klo kita melihat dari sisi
assemblynya, x1 diperlakukan sebagai value of, sedangkan x2 sebagai
address of [x2].
Maaf klo malah tambah bingung :D
--
Regards,
Sirajuddin Maizir