saving values in block problem

Discussion in 'Ruby' started by Peng Zuo, May 26, 2009.

  1. Peng Zuo

    Peng Zuo Guest

    [Note: parts of this message were removed to make it a legal post.]

    Hi,I'm using ruby 1.87. this problem seems to be the block context bug for
    1.8x, in the results array, I always got the same value, which is the last
    return value of the iteration .
    I've got an object, which has multiple states. when I call each_state, I'm
    actually changing the state.

    results = []
    an_object.each_state do |the_object|
    #some manipulations
    results << the_object
    end

    the each_state method looks like:

    def each_state
    #blah blah, change the current state
    yield(self) # I also tried self.dup, but it didnt work either.
    end

    anyone knows how to solve this?
    TIA

    Regards,

    Peng Zuo
     
    Peng Zuo, May 26, 2009
    #1
    1. Advertising

  2. Peng Zuo wrote:
    > Hi,I'm using ruby 1.87. this problem seems to be the block context bug for
    > 1.8x, in the results array, I always got the same value, which is the last
    > return value of the iteration .
    > I've got an object, which has multiple states. when I call each_state, I'm
    > actually changing the state.
    >
    > results = []
    > an_object.each_state do |the_object|
    > #some manipulations
    > results << the_object
    > end
    >
    > the each_state method looks like:
    >
    > def each_state
    > #blah blah, change the current state
    > yield(self) # I also tried self.dup, but it didnt work either.
    > end


    I'm guessing what you want is for results to be a snapshot of the
    object as it is in the i-th state?

    If dup doesn't work, maybe your object has some other objects attached
    to it in which you are storing something? In that case, try a deep copy:

    Marshal.load(Marshal.dump(self))

    --
    vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
     
    Joel VanderWerf, May 26, 2009
    #2
    1. Advertising

  3. Peng Zuo wrote:
    > Hi,I'm using ruby 1.87. this problem seems to be the block context bug


    http://www.catb.org/~esr/faqs/smart-questions.html#id306810

    Does this explain what you are seeing?

    irb(main):001:0> a = []
    => []
    irb(main):002:0> str = "xxx"
    => "xxx"
    irb(main):003:0> a << str
    => ["xxx"]
    irb(main):004:0> str << "yyy"
    => "xxxyyy"
    irb(main):005:0> a << str
    => ["xxxyyy", "xxxyyy"]
    irb(main):006:0> str << "zzz"
    => "xxxyyyzzz"
    irb(main):007:0> a << str
    => ["xxxyyyzzz", "xxxyyyzzz", "xxxyyyzzz"]
    irb(main):008:0> a
    => ["xxxyyyzzz", "xxxyyyzzz", "xxxyyyzzz"]
    irb(main):009:0>

    An array only holds references to objects. If you insert a reference to
    the same object multiple times into the array, then you will simply see
    the same object multiple times.

    As for why 'dup' doesn't work: you'll need to show your code. If you are
    maintaining state in an instance variable, dup should work. If you are
    maintaining state indirectly - the instance variable points to some
    other object which in turn holds state - then the dup'd object will
    still point to this same object.
    --
    Posted via http://www.ruby-forum.com/.
     
    Brian Candler, May 26, 2009
    #3
    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. Rob Meade
    Replies:
    2
    Views:
    1,785
    Rob Meade
    Aug 10, 2004
  2. John Kandell
    Replies:
    4
    Views:
    4,227
    eeebop
    Dec 10, 2004
  3. Luis Esteban Valencia
    Replies:
    0
    Views:
    2,555
    Luis Esteban Valencia
    Jan 6, 2005
  4. Andy
    Replies:
    0
    Views:
    560
  5. morrell
    Replies:
    1
    Views:
    999
    roy axenov
    Oct 10, 2006
Loading...

Share This Page