methods/scope/locals_stay_local_parens.rb

tests/_examples/methods/scope/locals_stay_local_parens.rb in the metorex repository.

# A method body and a class body each have their own locals. An assignment
# inside one never reaches a same-named variable outside it.

shared = "outer"

def shadows
  shared = "inner"
  shared
end

puts(shadows)
puts(shared)

def runs_a_block
  shared = ["method", "local"]
  yield
end

runs_a_block { puts(shared) }
puts(shared)

class Body
  shared = "class body"
  BODY_VALUE = shared
end

puts(Body::BODY_VALUE)
puts(shared)

def counts
  total = 0
  [1, 2, 3].each { |value| total = total + value }
  total
end

puts(counts)

Output:

inner
outer
outer
outer
class body
outer
6