[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Beginner's question: assigning same value to many variables

Alex Khere

8/11/2006 11:12:00 PM

I'm just starting out in programming, using Ruby to learn.

I'm trying to write a short program that will use a handful of
variables, and I want to be sure that all of the variables start with
the value '' (strings of zero length).

Is there a way to list all of the variables on a single line and set
them to the same value? I tried using commas to seperate, but that
didn't work.

I also tried creating an array with all of the variable names and then
using "arrayname.each do |name|" to cycle through the assignment, but
since the varibles hadn't been defined, I got an "undefined local
variable or method" error (at least, I think that's why I got an error).


--
Posted via http://www.ruby-....

14 Answers

e

8/11/2006 11:44:00 PM

0

Alex Khere wrote:
> I'm just starting out in programming, using Ruby to learn.
>
> I'm trying to write a short program that will use a handful of
> variables, and I want to be sure that all of the variables start with
> the value '' (strings of zero length).
>
> Is there a way to list all of the variables on a single line and set
> them to the same value? I tried using commas to seperate, but that
> didn't work.
>
> I also tried creating an array with all of the variable names and then
> using "arrayname.each do |name|" to cycle through the assignment, but
> since the varibles hadn't been defined, I got an "undefined local
> variable or method" error (at least, I think that's why I got an error).

In ruby there are no statements, just expressions. Therefore:

@a = @b = 0

The one caveat, though, is that the references are the same
which means that, for example, assigning "hello" this way
might lead to some confusing results.

Some alternatives include:

@a, @b = 0, 0

@a, @b = Array.new(2) {"Hello"}

Another popular idiom is to defer the initialisation to the
point of first use of the variable. For this the || operator
is often used:

do_something_with(@a || default_value)

do_something_else_with(@b ||= other_default)

The latter operator is shorthand for (@b = @b || default) which
will also assign the default to @b for future use.


--
Posted via http://www.ruby-....

Suraj Kurapati

8/11/2006 11:46:00 PM

0

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Mark Van Holstyn wrote:
> %w{ a b c d e f g h i j }.each {|v| eval "#{v}=''" }

Isn't that considered _evil_? Using eval on a string, that is.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (GNU/Linux)

iD8DBQFE3RZ4mV9O7RYnKMcRAhmhAJ441UdVf3buQW8zgk5mJsvJjcjarQCfUG9i
o4EV0AnygtsrSBhrQsGUh1A=
=LLzM
-----END PGP SIGNATURE-----

dblack

8/11/2006 11:46:00 PM

0

Alex Khere

8/11/2006 11:48:00 PM

0

Eero Saynatkari wrote:

> In ruby there are no statements, just expressions. Therefore:
>
> @a = @b = 0
>
> The one caveat, though, is that the references are the same
> which means that, for example, assigning "hello" this way
> might lead to some confusing results...


Thank you, the first example will probably work in this case, but I can
experiment with your other examples.

--
Posted via http://www.ruby-....

Chad Perrin

8/11/2006 11:48:00 PM

0

On Sat, Aug 12, 2006 at 08:45:43AM +0900, Suraj N. Kurapati wrote:
>
> Mark Van Holstyn wrote:
> > %w{ a b c d e f g h i j }.each {|v| eval "#{v}=''" }
>
> Isn't that considered _evil_? Using eval on a string, that is.

Maybe we should call it "evil" instead of "eval", then.

--
CCD CopyWrite Chad Perrin [ http://ccd.ap... ]
"The ability to quote is a serviceable
substitute for wit." - W. Somerset Maugham

dblack

8/11/2006 11:58:00 PM

0

Chad Perrin

8/12/2006 12:07:00 AM

0

On Sat, Aug 12, 2006 at 08:57:37AM +0900, dblack@wobblini.net wrote:
> On Sat, 12 Aug 2006, Mark Van Holstyn wrote:
>
> >or you could do
> >
> >%w{ a b c d e f g h i j }.each {|v| eval "#{v}=''" }
>
> That won't work; they'll go out of scope. Actually out of two scopes:
> the eval scope, and the #each block scope.

. . which is great if you're trying to construct a closure, but not so
great otherwise.

--
CCD CopyWrite Chad Perrin [ http://ccd.ap... ]
"The measure on a man's real character is what he would do
if he knew he would never be found out." - Thomas McCauley

dblack

8/12/2006 12:11:00 AM

0

Morton Goldberg

8/12/2006 4:21:00 AM

0

I presume you want each variable initialized to a _different_ empty
string. If so, I can't think of an easy way to do it using local
variables. That may just go to show my lack of ruby smarts. However,
it's not too hard to initialize a group of instance variables to
different empty strings in one line of code. Consider:

#! /usr/bin/ruby -w

class Foo
def initialize
%w[@a @b @c @d].each {|v| instance_variable_set(v, '')}
end
end

foo = Foo.new
p foo #=> #<Foo:0x2556c @c="", @b="", @a="", @d="">

And the following will work for global variables.

%w[$a, $b, $c, $d].each {|v| eval("%s=String.new" % v)}
p [$a, $b, $c, $d] #=> ["", "", "", ""]

But for local variables, I don't know.

Regards, Morton

On Aug 11, 2006, at 7:12 PM, Alex Khere wrote:

> I'm just starting out in programming, using Ruby to learn.
>
> I'm trying to write a short program that will use a handful of
> variables, and I want to be sure that all of the variables start with
> the value '' (strings of zero length).
>
> Is there a way to list all of the variables on a single line and set
> them to the same value? I tried using commas to seperate, but that
> didn't work.
>
> I also tried creating an array with all of the variable names and then
> using "arrayname.each do |name|" to cycle through the assignment, but
> since the varibles hadn't been defined, I got an "undefined local
> variable or method" error (at least, I think that's why I got an
> error).


Gennady Bystritsky

8/12/2006 6:40:00 AM

0

> -----Original Message-----
> From: Morton Goldberg [mailto:m_goldberg@ameritech.net]
> Sent: Friday, August 11, 2006 9:21 PM
> To: ruby-talk ML
> Subject: Re: Beginner's question: assigning same value to
> many variables
>
> I presume you want each variable initialized to a _different_ empty
> string. If so, I can't think of an easy way to do it using local
> variables. That may just go to show my lack of ruby smarts. However,
> it's not too hard to initialize a group of instance variables to
> different empty strings in one line of code. Consider:
>
> #! /usr/bin/ruby -w
>
> class Foo
> def initialize
> %w[@a @b @c @d].each {|v| instance_variable_set(v, '')}
> end
> end
>
> foo = Foo.new
> p foo #=> #<Foo:0x2556c @c="", @b="", @a="", @d="">
>
> And the following will work for global variables.
>
> %w[$a, $b, $c, $d].each {|v| eval("%s=String.new" % v)}
> p [$a, $b, $c, $d] #=> ["", "", "", ""]
>
> But for local variables, I don't know.

How about this:

irb(main):001:0> a, b, c = Array.new(3) { '' }
=> ["", "", ""]
irb(main):002:0> a
=> ""
irb(main):003:0> b
=> ""
irb(main):004:0> c
=> ""
irb(main):005:0> a.object_id
=> 203740
irb(main):006:0> b.object_id
=> 203730
irb(main):007:0> c.object_id
=> 203720
irb(main):008:0>

It will work for global and instance variables as well.

Best,
Gennady.

>
> Regards, Morton
>
> On Aug 11, 2006, at 7:12 PM, Alex Khere wrote:
>
> > I'm just starting out in programming, using Ruby to learn.
> >
> > I'm trying to write a short program that will use a handful of
> > variables, and I want to be sure that all of the variables
> start with
> > the value '' (strings of zero length).
> >
> > Is there a way to list all of the variables on a single line and set
> > them to the same value? I tried using commas to seperate, but that
> > didn't work.
> >
> > I also tried creating an array with all of the variable
> names and then
> > using "arrayname.each do |name|" to cycle through the
> assignment, but
> > since the varibles hadn't been defined, I got an "undefined local
> > variable or method" error (at least, I think that's why I got an
> > error).
>
>
>