Block variable & Local variable

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? )

|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.

Eugen

Eugen C. wrote:

|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.

Eugen

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

Eugen C. wrote:

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.

It means in ruby v 1.8.6 block variable and local variable are the same
, and not difference between them ?

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

Am 03.08.2010 11:02, schrieb Eugen C.:

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-----

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).

On 08/03/2010 12:45 PM, Amir E. wrote:
Eugen C. wrote:
  
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.

It means in ruby v 1.8.6 block variable and local variable are the same
, and not difference between them ?
  

Hi –

On Tue, 3 Aug 2010, Eugen C. wrote:

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

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.

Amir E. wrote:

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 :frowning: