Pointer concept in Ruby ?

Discussion in 'Ruby' started by Iñaki Baz Castillo, Apr 24, 2008.

  1. SGksIEknZCBsaWtlIHRvIGhhdmUgYSB2YXJpYWJsZSBwb2ludGluZyB0byBhIEhhc2gvQXJyYXkg
    ZWxlbWVudCwgc28KaWYgSSBtb2RpZnkgdGhlIHZhcmlhYmxlIHRoZW4gdGhlIEhhc2gvQXJyYXkg
    ZWxlbWVudCBpcyBtb2RpZmllZCB0b28uCgpBRkFJSyB0aGlzIGlzIG5vdCBwb3NzaWJsZSB3aXRo
    IFJ1Ynkgc2luY2UgdGhlIGFic2NlbnNlIG9mIHBvaW50ZXIKY29uY2VwdC4gSSB3YW50IHRoZSBm
    b2xsb3dpbmc6CgogIGFycmF5ID0gWyAiYWFhIiwgImJiYiIsICJjY2MiIF0KCiAgYTEgPSBhcnJh
    eVsxXS5fc29tZV9tZXRob2RfCiAgPT4gImJiYiIKCiAgYTEgPSAiQkJCIgogID0+ICJCQkIiCgog
    IGFbMV0KICA9PiAiQkJCIgoKSXMgaXQgcG9zc2libGUgaW4gc29tZSB3YXk/IFRoYW5rcyBhIGxv
    dC4KCgotLSAKScOxYWtpIEJheiBDYXN0aWxsbwo8aWJjQGFsaWF4Lm5ldD4K
     
    Iñaki Baz Castillo, Apr 24, 2008
    #1
    1. Advertising

  2. On Apr 24, 2008, at 18:01, I=F1aki Baz Castillo wrote:

    > Hi, I'd like to have a variable pointing to a Hash/Array element, so
    > if I modify the variable then the Hash/Array element is modified too.
    >
    > AFAIK this is not possible with Ruby since the abscense of pointer
    > concept. I want the following:
    >
    > array =3D [ "aaa", "bbb", "ccc" ]
    >
    > a1 =3D array[1]._some_method_
    > =3D> "bbb"
    >
    > a1 =3D "BBB"
    > =3D> "BBB"
    >
    > a[1]
    > =3D> "BBB"
    >
    > Is it possible in some way? Thanks a lot.
    >
    >
    > -- =20
    > I=F1aki Baz Castillo
    > <>


    Quoth irb:

    >> array =3D [ "aaa", "bbb", "ccc" ]

    =3D> ["aaa", "bbb", "ccc"]
    >> a1 =3D array[1]

    =3D> "bbb"
    >> a1.upcase!

    =3D> "BBB"
    >> array

    =3D> ["aaa", "BBB", "ccc"]
    >>


    You never pass by value, so you're in essence always dealing with =20
    pointers.
    With your example, you merely made a1 point at a different object, a =20
    new string, instead of the second string in the array.

    If you however call a self-modifying method on a1 while it's pointing =20=

    at the array string, it'll also change in the array, as it's still =20
    pointing at the same object.

    What are you trying to achieve in practice?=
     
    Mikael Høilund, Apr 24, 2008
    #2
    1. Advertising

  3. Iñaki Baz Castillo

    Bill Kelly Guest

    From: "Iñaki Baz Castillo" <>
    >
    > Hi, I'd like to have a variable pointing to a Hash/Array element, so
    > if I modify the variable then the Hash/Array element is modified too.
    >
    > AFAIK this is not possible with Ruby since the abscense of pointer
    > concept. I want the following:
    >
    > array = [ "aaa", "bbb", "ccc" ]
    >
    > a1 = array[1]._some_method_
    > => "bbb"
    >
    > a1 = "BBB"
    > => "BBB"
    >
    > a[1]
    > => "BBB"
    >
    > Is it possible in some way? Thanks a lot.


    In general this not easily possible with Ruby, and you'll probably want to
    rethink your design so that you don't need to do that.

    However, there is a String#replace method, which may be useful if you're
    sure this is what you want to do:

    => ["aaa", "bbb", "ccc"]
    >> a1 = array[1]

    => "bbb"
    >> a1.replace "BBB"

    => "BBB"
    >> array[1]

    => "BBB"


    Regards,

    Bill
     
    Bill Kelly, Apr 24, 2008
    #3
  4. MjAwOC80LzI0LCBJw7Fha2kgQmF6IENhc3RpbGxvIDxpYmNAYWxpYXgubmV0PjoKPiBObywgdGhh
    dCdzIG5vdCB0cnVlLiBEZW1vc3RyYXRpb246Cj4KPiAgYXJyYXk9WzAwMCwxMTEsMjIyLDMzXQo+
    ICA9PiBbMCwgMTExLCAyMjIsIDMzXQoKU29ycnksIGl0IHdhczoKCmE9WzAsMSwyLDNdCgoKPiAg
    YTE9YVsxXQo+ICA9PiAxCj4KPiAgYVsxXS5vYmplY3RfaWQKPiAgPT4gMzQ1Cj4KPiAgYTEub2Jq
    ZWN0X2lkCj4gID0+IDM0NQo+Cj4gIGExPSJORVcgVkFMVUUiCj4gID0+ICJORVcgVkFMVUUiCj4K
    PiAgPiBhMS5vYmplY3RfaWQKPiAgPT4gLTYwNjA4MTA5OCAgIDwtLS0tLS0tLS0tLSBIYXMgY2hh
    bmdlZCAhISEKPgo+ICBhWzFdLm9iamVjdF9pZCAgIDwtLS0tLS0tLSBSZW1haW5zIHRoZSBzYW1l
    Cj4gID0+IDM0NQo+Cj4gIGExCj4gID0+ICJORVcgVkFMVUUiCj4KPiAgYVsxXQo+ICA9PiAxICA8
    LS0tLS0tLS0tLS0gT3JpZ2luYWwgdmFsdWUgbm90IGNoYW5nZWQKCgotLSAKScOxYWtpIEJheiBD
    YXN0aWxsbwo8aWJjQGFsaWF4Lm5ldD4K
     
    Iñaki Baz Castillo, Apr 24, 2008
    #4
  5. MjAwOC80LzI0LCBCaWxsIEtlbGx5IDxiaWxsa0BjdHMuY29tPjoKCj4gIEhvd2V2ZXIsIHRoZXJl
    IGlzIGEgU3RyaW5nI3JlcGxhY2UgbWV0aG9kLCB3aGljaCBtYXkgYmUgdXNlZnVsIGlmIHlvdSdy
    ZQo+ICBzdXJlIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbzoKPgo+ICA9PiBbImFhYSIsICJi
    YmIiLCAiY2NjIl0KPgo+ID4KPiA+ID4gYTEgPSBhcnJheVsxXQo+ID4gPgo+ID4KPiAgPT4gImJi
    YiIKPgo+ID4KPiA+ID4gYTEucmVwbGFjZSAiQkJCIgo+ID4gPgo+ID4KPiAgPT4gIkJCQiIKPgo+
    ID4KPiA+ID4gYXJyYXlbMV0KPiA+ID4KPiA+Cj4gID0+ICJCQkIiCgpPaCwgcmVhbGx5IGN1cmlv
    dXMgYnV0IEkgZG9uJ3QgbGlrZSBpdCBzaW5jZSBpdCdzIGp1c3QgdmFsaWQgZm9yCnN0cmluZ3Mg
    KHdoeT8/KSBhbmQgaXQgcmVxdWlyZXMgdmFyaWFibGUgdG8gYmUgYWxyZWFkeSBkZWZpbmVkLiBJ
    c24ndAp0aGVyZSBhbnkgbWVob3RkIG1vcmUgIm5vcm1hbCI/IHNvbWV0aGluZyBhczoKCmEyID0g
    YXJyYXlbMl0uX3NvbWV0aGluZ18KCmEyPSJRV0UiCgphcnJheVsyXQo9PiAiUVdFIgoKClRoYW5r
    cyBhIGxvdC4KCi0tIApJw7Fha2kgQmF6IENhc3RpbGxvCjxpYmNAYWxpYXgubmV0Pgo=
     
    Iñaki Baz Castillo, Apr 24, 2008
    #5
  6. * Iñaki Baz Castillo <> (18:24) schrieb:

    >> If you however call a self-modifying method on a1 while it's pointing at
    >> the array string, it'll also change in the array, as it's still pointing at
    >> the same object.

    >
    > No, that's not true. Demostration:


    You aren't calling a "self-modifying method".

    mfg, simon .... l
     
    Simon Krahnke, Apr 24, 2008
    #6
  7. * Iñaki Baz Castillo <> (18:30) schrieb:

    > a2 = array[2]._something_
    >
    > a2="QWE"
    >
    > array[2]
    > => "QWE"


    You can't redefine =.

    mfg, simon .... l
     
    Simon Krahnke, Apr 24, 2008
    #7
  8. Iñaki Baz Castillo

    Adam Shelly Guest

    On 4/24/08, I=F1aki Baz Castillo <> wrote:
    > Isn't there any mehotd more "normal"? something as:
    >
    > a2 =3D array[2]._something_
    >
    > a2=3D"QWE"
    >
    > array[2]
    > =3D> "QWE"
    >


    There are probabaly a million reasons this is a bad idea, but what about:

    require 'ptrclass'
    =3D> true
    a =3D [0,1,2,3]
    =3D> [0, 1, 2, 3]
    ap =3D a.ptr(3)
    =3D> 3
    ap.val=3D4
    =3D> 4
    a
    =3D> [0, 1, 2, 4]
    r=3Da.ptr(6)
    =3D> nil
    r.val=3D4
    =3D> 4
    a
    =3D> [1, 34, 3, nil, nil, nil, 4]

    --- ptrclass.rb----
    class PtrClass < DelegateClass(Object)
    def initialize v
    super
    __setobj__ v
    end
    def val=3D v
    __setobj__ v
    end
    end
    class Array
    def ptr n
    v=3D self[n]
    self[n] =3D v.is_a?(PtrClass) ? v : PtrClass.new(v)
    end
    end

    ---
    -Adam
     
    Adam Shelly, Apr 24, 2008
    #8
  9. El Jueves, 24 de Abril de 2008, escribi=C3=B3:
    > In your example, you weren't changing what a1 pointed to; you were not
    > changing anything about the object itself.
    >
    > irb(main):001:0> a =3D ['0','1','2','3']
    > =3D> ["0", "1", "2", "3"]
    > irb(main):002:0> a[1]
    > =3D> "1"
    > irb(main):003:0> a1 =3D a[1]
    > =3D> "1"
    > irb(main):004:0> a1 << 'abc'
    > =3D> "1abc"
    > irb(main):005:0> a[1]
    > =3D> "1abc"
    >
    > This is what he meant by "self-modifying" methods. =C2=A0Methods that cha=

    nge
    > something about the object itself.


    Really thanks. You are right, I didn't understand the meaning=20
    of "self-modifying" method, I thought that "=3D" was also a "self-modifying=
    "=20
    method.

    Sorry for the confusion and thanks a lot.

    =2D-=20
    I=C3=B1aki Baz Castillo
     
    Iñaki Baz Castillo, Apr 24, 2008
    #9
  10. El Jueves, 24 de Abril de 2008, Adam Shelly escribi=F3:
    > There are probabaly a million reasons this is a bad idea, but what about:
    >
    > require 'ptrclass'
    > =3D> true
    > a =3D [0,1,2,3]
    > =3D> [0, 1, 2, 3]
    > ap =3D a.ptr(3)
    > =3D> 3
    > ap.val=3D4
    > =3D> 4
    > a
    > =3D> [0, 1, 2, 4]
    > r=3Da.ptr(6)
    > =3D> nil
    > r.val=3D4
    > =3D> 4
    > a
    > =3D> [1, 34, 3, nil, nil, nil, 4]
    >
    > --- ptrclass.rb----
    > class PtrClass < DelegateClass(Object)
    > def initialize v
    > super
    > __setobj__ v
    > end
    > def val=3D v
    > __setobj__ v
    > end
    > end
    > class Array
    > def ptr n
    > v=3D self[n]
    > self[n] =3D v.is_a?(PtrClass) ? v : PtrClass.new(v)
    > end
    > end


    It seems magic, thanks a lot.


    =2D-=20
    I=F1aki Baz Castillo
     
    Iñaki Baz Castillo, Apr 24, 2008
    #10
  11. I=C3=B1aki Baz Castillo wrote:
    > I thought that "=3D" was also a "self-modifying"
    > method.


    =3D isn't a method. If it was a method, x=3Dy could not result in x having =
    a=20
    different object_id than before. It could also not result in x having a=20
    different class than before.
    What x =3D y does, is that it makes x point to the same object as y which=20
    doesn't affect the old object x pointed to at all.
    Basically methods change the object (or not) and =3D changes the variable.
    I don't think it's possible to have a =3D method without static typing.

    Note though that in "foo.bar =3D baz" bar=3D actually is a method on foo an=
    d not=20
    an assignment operation.

    HTH,
    Sebastian
    =2D-=20
    NP: Depeche Mode - Little 15
    Jabber:
    ICQ: 205544826
     
    Sebastian Hungerecker, Apr 25, 2008
    #11
  12. MjAwOC80LzI1LCBTZWJhc3RpYW4gSHVuZ2VyZWNrZXIgPHNlcHAya0Bnb29nbGVtYWlsLmNvbT46
    Cj4gScOxYWtpIEJheiBDYXN0aWxsbyB3cm90ZToKPiAgPiBJIHRob3VnaHQgdGhhdCAiPSIgd2Fz
    IGFsc28gYSAic2VsZi1tb2RpZnlpbmciCj4gID4gbWV0aG9kLgo+Cj4KPiA9IGlzbid0IGEgbWV0
    aG9kLiBJZiBpdCB3YXMgYSBtZXRob2QsIHg9eSBjb3VsZCBub3QgcmVzdWx0IGluIHggaGF2aW5n
    IGEKPiAgZGlmZmVyZW50IG9iamVjdF9pZCB0aGFuIGJlZm9yZS4gSXQgY291bGQgYWxzbyBub3Qg
    cmVzdWx0IGluIHggaGF2aW5nIGEKPiAgZGlmZmVyZW50IGNsYXNzIHRoYW4gYmVmb3JlLgo+ICBX
    aGF0IHggPSB5IGRvZXMsIGlzIHRoYXQgaXQgbWFrZXMgeCBwb2ludCB0byB0aGUgc2FtZSBvYmpl
    Y3QgYXMgeSB3aGljaAo+ICBkb2Vzbid0IGFmZmVjdCB0aGUgb2xkIG9iamVjdCB4IHBvaW50ZWQg
    dG8gYXQgYWxsLgo+ICBCYXNpY2FsbHkgbWV0aG9kcyBjaGFuZ2UgdGhlIG9iamVjdCAob3Igbm90
    KSBhbmQgPSBjaGFuZ2VzIHRoZSB2YXJpYWJsZS4KPiAgSSBkb24ndCB0aGluayBpdCdzIHBvc3Np
    YmxlIHRvIGhhdmUgYSA9IG1ldGhvZCB3aXRob3V0IHN0YXRpYyB0eXBpbmcuCj4KPiAgTm90ZSB0
    aG91Z2ggdGhhdCBpbiAiZm9vLmJhciA9IGJheiIgYmFyPSBhY3R1YWxseSBpcyBhIG1ldGhvZCBv
    biBmb28gYW5kIG5vdAo+ICBhbiBhc3NpZ25tZW50IG9wZXJhdGlvbi4KClRoYW5rcyBmb3IgdGhl
    IGV4cGxhbmF0aW9uLgoKSSB0cnllZCBkb2luZzoKCiAgYTIub2JqZWN0X2lkID0gYXJyYXlbMl0u
    b2JqZWN0X2lkCgpidXQgb2J2aW91c2x5IGlzIG5vdCBwZXJtaXR0ZWQgWERERAoKCgotLSAKScOx
    YWtpIEJheiBDYXN0aWxsbwo8aWJjQGFsaWF4Lm5ldD4K
     
    Iñaki Baz Castillo, Apr 25, 2008
    #12
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. a

    pointer and variable scope concept

    a, Jul 9, 2006, in forum: C Programming
    Replies:
    2
    Views:
    344
    Chris Dollin
    Jul 10, 2006
  2. Aff@n
    Replies:
    1
    Views:
    379
    Ian Collins
    Oct 16, 2006
  3. gsingh

    pointer concept

    gsingh, Oct 29, 2007, in forum: C Programming
    Replies:
    22
    Views:
    767
    Richard Heathfield
    Oct 30, 2007
  4. Replies:
    4
    Views:
    1,700
  5. Eric Mahurin

    RCR 304: reference/pointer concept

    Eric Mahurin, May 9, 2005, in forum: Ruby
    Replies:
    2
    Views:
    123
    Austin Ziegler
    May 9, 2005
Loading...

Share This Page