why doesn't this python-like ruby script work?
python, ruby, scope
Solution
See "Ruby classes, include, and scope" for more information about Ruby's scoping and scope gating.
There are a few ways to provide visibility to your test function. One is to make the variable an instance variable:
#!/usr/bin/ruby
@x = 5
def test
puts "x = #{@x}"
end
And another is to use a closure with lambda:
#!/usr/bin/ruby
x = 5
test = lambda do
puts "x = #{x}"
end
test.call
or Proc.new()
#!/usr/bin/ruby
x = 5
test = Proc.new do
puts "x = #{x}"
end
test.call
For the differences between lambda and Proc.new, see "When to use lambda, when to use Proc.new?".
Problem
I'm kind of confused about how scoping works in Ruby. Which Ruby scoping rules prevent the following code from printing out the value of x? ``` #!/usr/bin/ruby x = 5 def test puts "x = #{x}" end test # => undefined local variable or method `x' for main:Object ``` The equivalent Python script does print the value of x: ``` #!/usr/bin/python x = 5 def test(): print "x = %s" % x test() # => x = 5 ```