On Tue, Feb 8, 2011 at 12:06 PM, Phil Crissman <[email protected]>wrote:

>
> Phil
>
>
> On Tue, Feb 8, 2011 at 11:26 AM, David Kahn 
> <[email protected]>wrote:
>
>>
>>
>> On Tue, Feb 8, 2011 at 10:34 AM, Frederick Cheung <
>> [email protected]> wrote:
>>
>>> On Feb 8, 3:33 pm, David Kahn <[email protected]> wrote:
>>> > On Tue, Feb 8, 2011 at 9:06 AM, Frederick Cheung <
>>> [email protected]
>>> >
>>> > I see, I guess I got confused as I use ActiveRecord so much and within
>>> a
>>> > each block, by setting values and calling save it of course saves the
>>> > object. Is there a way to achieve what I am presenting, though, passing
>>> a
>>> > batch of variables and having them operated on and changed?
>>>
>>> that is very different. doing  some_object.foo = 'bar' is calling a
>>> method on an object that changes its state, whereas
>>> foo = bar just points a local variable at something new. (and in
>>> addition Fixnums/BigDecimal are immutable - there is no method you can
>>> call on a number to change it into another nmber)
>>>
>>
>> I think I am starting to see, maybe. Hopefully not being too annoying
>> here.
>>
>> It seems rather strange to me that if you have an object, i.e. a string
>> that it should behave differently than my Account object.... the string#=()
>> method is still a property, right? -- no different really than
>> account#name=(), so seems it would be logical that if I can do
>> account.name = 'x' within an iterator, that doing string='y' should also
>> work, but as we see it does not (lets put the Fixnums and BigDecimal aside
>> as I understand as a property they are re-created rather than modified).
>>
>> arr.each {|account| account.name = 'x'}
>>
>> arr.each {|string| string=('y')}
>>
>> .... they seem to me to be the same thing, unless objects are really not
>> the same.
>>
>>
>> But with another experiment I see something interesting --- if I
>> instantiate a string formally as an object, then I do get the by reference
>> relationship in an array:
>>
>> ruby-1.9.2-p136 :098 > str = String.new('David')
>>  => "David"
>> ruby-1.9.2-p136 :099 > arr = [str]
>>  => ["David"]
>> ruby-1.9.2-p136 :100 > arr.each {|s| str = 'new val'}
>>  => ["David"]
>> ruby-1.9.2-p136 :101 > str
>>  => "new val"
>>
>> But if I just do it as a normal assignment, I do not:
>>
>> ruby-1.9.2-p136 :106 > string = 'David'
>>  => "David"
>> ruby-1.9.2-p136 :107 > arr = [string]
>>  => ["David"]
>> ruby-1.9.2-p136 :108 > arr.each {|s| s = 'new val'}
>>  => ["David"]
>> ruby-1.9.2-p136 :109 > string
>>  => "David"
>>
>>
> In the first case, you explicitly changed the value of the local variable
> str... it didn't change the array contents. In the second case you only
> changed the value inside the scope of the block that was enumerating
> through. Whether you created the string with String.new or not won't make a
> difference.
>
> Oh, right, I see my errror


> Ruby does pass object by reference, but when you do s = "whatever" in the
> block, you're creating a new local variable that only lives as long as the
> scope of the block.
>
> If you want to modify an array of strings, for example, you could do:
>
> arr = ["John", "Doe"]
> => ["John","Doe"]
> arr.each{|s| s.replace("blah") }
> => ["blah","blah"]
>
> s.replace actually modifies the object, instead of creating a new one.
>

Perfect, now I think I've got it, thanks!


>
>
>
>> I thought that doing
>>
>> str = 'David'
>>
>> was just a shortcut to doing
>>
>> str = String.new('David')
>>
>> But apparently the behavior at least in the context of an array is
>> different. Wow!
>>
>
>>
>>
>>>
>>> >
>>> > Excuse my ingenuity, but I am trying to understand... if I have an
>>> array of
>>> > variables it seems that when the array is created, the elements which
>>> were
>>> > variables are substituted by values, and there is no reference:
>>>
>>>
>>> > (rdb:1) arr = [v1,v2,v3]
>>> > [1, 2, 3]
>>>
>>> Without resorting to dirty tricks, you can't change the values of
>>> local variables other than by actually doing
>>> v1 = 2. arr does NOT contain [v1,v2,v3]. It contains 3 objects, and
>>> the local variables v1,v2,v3 just happen to also be referencing those
>>> same objects.
>>>
>>> Fred
>>>
>>> > (rdb:1) v1
>>> > 1
>>> > (rdb:1) arr[0]=5
>>> > 5
>>> > (rdb:1) v1
>>> > 1
>>> >
>>> > This must sound like kindergarten but apparently I have been working
>>> albeit
>>> > successfully under some very false premises.
>>> >
>>> >
>>> >
>>> >
>>> >
>>> > > Fred
>>> >
>>> > > --
>>> > > You received this message because you are subscribed to the Google
>>> Groups
>>> > > "Ruby on Rails: Talk" group.
>>> > > To post to this group, send email to
>>> [email protected].
>>> > > To unsubscribe from this group, send email to
>>> > > [email protected].
>>> > > For more options, visit this group at
>>> > >http://groups.google.com/group/rubyonrails-talk?hl=en.
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Ruby on Rails: Talk" group.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected].
>>> For more options, visit this group at
>>> http://groups.google.com/group/rubyonrails-talk?hl=en.
>>>
>>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "Ruby on Rails: Talk" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected].
>> For more options, visit this group at
>> http://groups.google.com/group/rubyonrails-talk?hl=en.
>>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-talk?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to