"Local variable within code blocks do not interfere with thoseoutside the block"

Discussion in 'Ruby' started by Kaye Ng, May 24, 2011.

  1. Kaye Ng

    Kaye Ng Guest

    I read this in a book.

    " In Ruby 1.9, however, local variables used within code blocks will not
    interfere with local variables located outside of the block."

    I don't know if my code is wrong, but it looks to me like the local
    variable inside the code block DOES interfere with the local variable
    (with the same name) outside the code block.

    x = [1, 2, 3, 4, 5]
    var = 1

    x.each do
    |number| (var = 10)
    end

    puts var

    -----------------------------------------------------

    Or do I not understand the concept? I'm using 1.9.2

    --
    Posted via http://www.ruby-forum.com/.
    Kaye Ng, May 24, 2011
    #1
    1. Advertising

  2. [Note: parts of this message were removed to make it a legal post.]

    On Tue, May 24, 2011 at 10:45 AM, Kaye Ng <> wrote:

    > " In Ruby 1.9, however, local variables used within code blocks will not
    > interfere with local variables located outside of the block."
    >
    > I don't know if my code is wrong, but it looks to me like the local
    > variable inside the code block DOES interfere with the local variable
    > (with the same name) outside the code block.
    >
    > x = [1, 2, 3, 4, 5]
    > var = 1
    >
    > x.each do
    > |number| (var = 10)
    > end
    >
    > puts var
    >


    It's affecting `var` because of the assignment, and because it's not an
    argument to the block. You might find
    http://ruby.runpaint.org/closures#block-local-variables useful to read
    through. Also consider this:

    a = 1; [2].each { |x| p a }; a #=> 1; 1
    a = 1; [2].each { |x| a = 10; p a }; a #=> 10; 10
    a = 1; [2].each { |a| p a }; a #=> 2; 1
    a = 1; [2].each { |a| p a; a = 10; p a }; a #=> 2; 10; 1

    And with block-local variables in 1.9:

    a = 1; [2].each { |;a| p a; }; a #=> nil; 1
    a = 1; [2].each { |;a| p a; a = 2; p a }; a #=> nil; 2; 1
    Adam Prescott, May 24, 2011
    #2
    1. Advertising

  3. [Note: parts of this message were removed to make it a legal post.]

    On Tue, May 24, 2011 at 11:07 AM, Adam Prescott <> wrote:

    > a = 1; [2].each { |a| p a }; a #=> 2; 1
    >


    Important to note that this differs from 1.8:

    RUBY_VERSION #=> 1.9.2
    a = 1; [2].each { |a| p a }; a #=> 2; 1

    RUBY_VERSION #=> 1.8.7
    a = 1; [2].each { |a| p a }; a #=> 2; 2
    Adam Prescott, May 24, 2011
    #3
  4. Kaye Ng

    Kaye Ng Guest

    to Adam Prescott,

    Hi Adam. There's only one thing I don't understand:

    a = 1; [2].each { |;a| p a; }; a #=> nil; 1
    a = 1; [2].each { |;a| p a; a = 2; p a }; a #=> nil; 2; 1

    This is the first time I've seen a variable passed into a code block
    with a semicolon preceding it
    |;a|
    and also semicolon following the variable
    p a;

    I'm not sure what it does nor do I understand its significance. =)

    --
    Posted via http://www.ruby-forum.com/.
    Kaye Ng, May 26, 2011
    #4
  5. Re: to Adam Prescott,

    [Note: parts of this message were removed to make it a legal post.]

    On Thu, May 26, 2011 at 8:42 AM, Kaye Ng <> wrote:

    > I'm not sure what it does nor do I understand its significance. =)
    >


    Mateusz has already explained it, but if you need more, you can visit the
    URL I gave just before the code in my post:

    http://ruby.runpaint.org/closures#block-local-variables
    Adam Prescott, May 26, 2011
    #5
  6. Kaye Ng

    Bala TS Guest

    Here x is a variable(array_variable) it contains 5 elements

    x = [1,2,3,4,5]


    x.each do |r|{puts "#{r}"}
    end

    => the result like this order
    1
    2
    3
    4
    5


    This code print x.length time print var= 10

    x.each do |r|{
    var = 10
    puts "#{var}"}
    end

    => the result like this order
    10
    10
    10
    10
    10

    But you gave
    x.each do |r|{
    var = 10
    }
    end
    puts "#{var}"

    => then the x.lenth'th last var value is printed here, the the reason u
    got ten value

    10

    --
    Posted via http://www.ruby-forum.com/.
    Bala TS, May 26, 2011
    #6
  7. Kaye Ng

    Josh Cheek Guest

    On Thu, May 26, 2011 at 4:20 AM, Bala TS <> wrote:
    > Here x is a variable(array_variable) it contains =A05 elements
    >
    > x =3D [1,2,3,4,5]
    >
    >
    > x.each do |r|{puts "#{r}"}
    > end
    >
    > =3D> the result like this order
    > 1
    > 2
    > 3
    > 4
    > 5
    >


    I've never seen code like this in Ruby. In fact, I get a syntax error
    when I try to run this code:

    untitled:2: syntax error, unexpected tSTRING_BEG, expecting keyword_do
    or '{' or '('
    x.each do |r|{puts "#{r}"}
    ^
    untitled:2: syntax error, unexpected '}', expecting keyword_end
    Josh Cheek, May 26, 2011
    #7
  8. [Note: parts of this message were removed to make it a legal post.]

    On Thu, May 26, 2011 at 10:20 AM, Bala TS <> wrote:

    > x.each do |r|{
    > var = 10
    > puts "#{var}"}
    > end
    >
    > => the result like this order
    > 10
    > 10
    > 10
    > 10
    > 10
    >
    > But you gave
    > x.each do |r|{
    > var = 10
    > }
    > end
    > puts "#{var}"
    >


    In addition to the syntax errors, you will find this happens:

    NameError: undefined local variable or method `var' for main:Object

    `var` is local to the block. Because of that, it doesn't accurately explain
    the problem.
    Adam Prescott, May 26, 2011
    #8
  9. Kaye Ng

    Bala TS Guest

    I got the point if you try like this way
    Here x is a variable(array_variable) it contains 5 elements

    x = [1,2,3,4,5]


    x.each do |r|
    puts "#{r}"
    end

    => the result like this order
    1
    2
    3
    4
    5


    This code print x.length time print var= 10

    x.each do |r|
    var = 10
    puts "#{var}"
    end

    => the result like this order
    10
    10
    10
    10
    10

    But you gave
    x.each do |r|
    var = 10
    end
    puts "#{var}"

    x=[1,2,3,4,5]
    x.each do |r|
    @var = 10
    end
    puts "#{@var}"

    => then the x.lenth'th last var value is printed here, the the reason u
    got ten value

    10

    --
    Posted via http://www.ruby-forum.com/.
    Bala TS, May 26, 2011
    #9
  10. Kaye Ng

    Bala TS Guest

    Bala TS, May 27, 2011
    #10
  11. Kaye Ng

    Bala TS Guest

    Bala TS, May 27, 2011
    #11
  12. Kaye Ng

    Josh Cheek Guest

    [Note: parts of this message were removed to make it a legal post.]

    On Thu, May 26, 2011 at 11:11 PM, Bala TS <> wrote:

    > I have jpg file Here the results are available(screen shot)
    >
    > by
    > bala(bdeveloper01)
    >
    > Attachments:
    > http://www.ruby-forum.com/attachment/6232/localvariable.jpg
    >
    >
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    >


    r.to_s is equal to "#{r}", but more straightforward. So when you want to
    convert something to a string, it is better to use its to_s method.

    The puts method, though, invokes the to_s method on the object before it
    outputs it. So when you are sending an object to puts, you don't need to
    worry about whether it is a string at all.

    puts "#{r}" # so rather than this
    puts r # instead use this
    Josh Cheek, May 27, 2011
    #12
  13. Kaye Ng

    Bala TS Guest

    Josh Cheek wrote in post #1001405:
    > On Thu, May 26, 2011 at 11:11 PM, Bala TS <>
    > wrote:
    >
    >> Posted via http://www.ruby-forum.com/.
    >>
    >>

    >
    > r.to_s is equal to "#{r}", but more straightforward. So when you want to
    > convert something to a string, it is better to use its to_s method.
    >
    > The puts method, though, invokes the to_s method on the object before it
    > outputs it. So when you are sending an object to puts, you don't need to
    > worry about whether it is a string at all.
    >
    > puts "#{r}" # so rather than this
    > puts r # instead use this



    If you want to give some name string then
    puts r #is not work
    puts "value:#{r}"

    => result should come like this format

    value:1
    value:2
    value:3
    value:4
    value:5

    like this way

    by
    bala(bdeveloper01)

    --
    Posted via http://www.ruby-forum.com/.
    Bala TS, May 27, 2011
    #13
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page