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? )
···
--
Posted via http://www.ruby-forum.com/.
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? )
--
Posted via http://www.ruby-forum.com/.
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
On 08/03/2010 11:19 AM, Amir Ebrahimifard 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? )
Amir Ebrahimifard 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
--
Posted via http://www.ruby-forum.com/\.
Eugen Ciur 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
--
Posted via http://www.ruby-forum.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.
On 08/03/2010 11:53 AM, Guglielmo Fachini wrote:
Eugen Ciur 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
Eugen Ciur wrote:
Look here
http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0/NEWSSince 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 ?
--
Posted via http://www.ruby-forum.com/\.
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
Am 03.08.2010 11:02, schrieb Eugen Ciur:
Look here
http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0/NEWSSince 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.
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).
> Eugen Ciur wrote:
> > Look here
> > [http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0/NEWS](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 ?
On 08/03/2010 12:45 PM, Amir Ebrahimifard wrote:
Hi --
On Tue, 3 Aug 2010, Eugen Ciur 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