Block variable & Local variable

  • Thread starter Amir Ebrahimifard
  • Start date
A

Amir Ebrahimifard

Hi
What does happen for "num" variable in this code :

array = [1,2,3,4,5]
x = 1
num = 1
array.each { |num| puts num*20 + x }

( after this code when I type "puts num , ruby return 5 ! why? )
 
E

Eugen Ciur

|num| inside block iterates through array's items.
Last item in array is 5, thus |num| value will be the one from last
iteration of 'each' method.
It is better to rename |num| to something else, |item| for example.
 
G

Guglielmo Fachini

Eugen said:
|num| inside block iterates through array's items.
Last item in array is 5, thus |num| value will be the one from last
iteration of 'each' method.
It is better to rename |num| to something else, |item| for example.

I've tried it in my machine and the output is 1...

C:\Users\Guglielmo>ruby -v
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]

C:\Users\Guglielmo>ruby
array = [1,2,3,4,5]
x = 1
num = 1
array.each { |num| puts num*20 + x }
puts num
^D
21
41
61
81
101
1
 
E

Eugen Ciur

Look here
http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0/NEWS

Since v 1.9.1 block arguments (in our case |num|) are always local,
i.e in 'each' block |num| will not conflict
with outer 'num' variable. In your machine you have 1.9.1 version.

Eugen said:
|num| inside block iterates through array's items.
Last item in array is 5, thus |num| value will be the one from last
iteration of 'each' method.
It is better to rename |num| to something else, |item| for example.
I've tried it in my machine and the output is 1...

C:\Users\Guglielmo>ruby -v
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]

C:\Users\Guglielmo>ruby
array = [1,2,3,4,5]
x = 1
num = 1
array.each { |num| puts num*20 + x }
puts num
^D
21
41
61
81
101
1
 
Q

Quintus

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

Am 03.08.2010 11:02, schrieb Eugen Ciur:
Look here
http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0/NEWS

Since v 1.9.1 block arguments (in our case |num|) are always local,
i.e in 'each' block |num| will not conflict
with outer 'num' variable. In your machine you have 1.9.1 version.

Additionally, if you run ruby with warnings enabled, you get notified:

marvin@ikarus:~$ ruby -w
array = [1,2,3,4,5]
x = 1
num = 1
array.each{|num| puts num*20 + x}
- -:4: warning: shadowing outer local variable - num
puts num
21
41
61
81
101
1
marvin@ikarus:~$ ruby -v
ruby 1.9.1p429 (2010-07-02 revision 28523) [x86_64-linux]
marvin@ikarus:~$

Marvin
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkxX5XwACgkQDYShvwAbcNksbQCfaq3nuXGd4OZNB3c1RGYeA2xS
2o0AoIfKBAfM8UttAfamaFxW9jwwJkOr
=orQI
-----END PGP SIGNATURE-----
 
D

David A. Black

Hi --

Not exactly. Blocks defines a new variable scope, however blocks have access
to variables defined outside block scope.
Thus, a variable defined outside block will be modified inside block (for
ruby 1.8.6).

In Ruby 1.9.1 too, for non-parameter variables -- for example:

a = nil
10.times {|i| a = i }
p a # 9


David

--
David A. Black, Senior Developer, Cyrus Innovation Inc.

The Ruby training with Black/Brown/McAnally
Compleat Philadelphia, PA, October 1-2, 2010
Rubyist http://www.compleatrubyist.com
 
B

Barchil Barchil

Amir said:
Hi
What does happen for "num" variable in this code :

array = [1,2,3,4,5]
x = 1
num = 1
array.each { |num| puts num*20 + x }

( after this code when I type "puts num , ruby return 5 ! why? )

I tried your code i added this at the end

puts(num)

i have this :

21
41
61
81
101
1

and i think its a correct response because we have two variables one
have the scope in the block who have at the end of iteration 5
the other variable have the value 1 witch is displayed

sorry for my bad English :(
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,146
Messages
2,570,832
Members
47,374
Latest member
EmeliaBryc

Latest Threads

Top