The block variable (item) is set by ruby to “point to” each object of
the
array in turn. String#downcase! is a destructive method: it changes its
receiver, so the elements of the original array get changed. On the
other
hand, when you do item = “”, you’re telling the variable itewm to “point
to”
another object, a new (empty) string. This doesn’t modify the original
array
at all.
If you want to change the contents of the original array, your should
use
Array#map!:
[title,subtitle,body].map! {|item| “”}
Array#map! replaces each element of the array with the return value of
the
block.
This successfully sets the original variables to “title”, “subtitle”,
“body”
No, it doesn’t. It changes the strings, it doesn’t do anything to the
variables. The variables still point to the same object as before, it’s
just the objects that are different now.
[title,subtitle,body].each {|item| item=""}
has no effect.
Why doesn’t this work? How can I make it work?
It works just fine. It just doesn’t do what you want it to. Here’s what
it
does:
It takes each of the elements in the array and then yields it. The code
in the
block will then run with item pointing to the element. After the
assignment
(item="") item will point to an empty string. This has no effect
whatsoever
on the variables title, subtitle and body.
What you want is map instead of each (which gives you a new array
containing
the results of yielding each item) or String#replace instead of
reassignment
(which would change the object instead of the variable).
[title,subtitle,body].each {|item| item=""}
Hi
item="" sets item to reference to another string instead of the original
at
the beginning of the block
try this
[title,subtitle,body].each {|item|
x = item
item=""
# this make item go to point away from it's original value
p x.inspect
# but x hasn't lost it's reference to initial value so it still
#works
It does not work because you assign to “item” which is a local variable
in the block. And since you do not change string objects in the Array
you do not see any change. In your case you should change the original
object, e.g.
I believe this is rather inefficient (aka slow) and more importantly
will not run under all circumstances ($SAFE). Plus, it’s not needed.
Whether or not it’s needed depends entirely on how much he’s condensed
the example to post it here. If he were interested in changing the class
of object, this is the only technique that would update the variables
automatically.
(So I’m doing more than the minimum needed to make the test case work,
so
I’m not a real extreme programmer.)
–Ken
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.