47

I'm sure there's a simple answer for this; I just can't seem to find it. I made a nested function in Ruby, and I was having trouble accessing variables from the outer function inside the inner function:

def foo(x)
  def bar
    puts x
  end
  bar
  42
end

foo(5)

I get: NameError: undefined local variable or methodx' for main:Object`

The analogous Python code works:

def foo(x):
  def bar():
    print x
  bar()
  return 42

foo(5)

So how do I do the same thing in Ruby?

1
  • 10
    An important (but subtle) distinction here is that def...end defines a method, not a function. use lambda/proc to define functions and capture local variables in a closure, as tadman shows. Commented Jun 19, 2009 at 5:30

1 Answer 1

56

As far as I know, defining a named function within a function does not give you access to any local variables.

What you can do instead is use a Proc:

def foo(x)
  bar = lambda do
    puts x
  end
  bar.call
  42
end

foo(5)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.