eval/locals_read_while_parsing.rb
tests/_examples/eval/locals_read_while_parsing.rb in the metorex repository.
# Code inside `#{}` and code given to `eval` is read knowing the locals of
# the scope it runs in, so `name [1]` indexes a local named `name` rather
# than calling a method of that name with an Array.
def items(*arguments)
[:method, arguments]
end
p("#{items [1]}")
items = [10, 20]
p("#{items [1]}")
p(:"#{items [0]}")
p(/#{items [0]}/)
[3].each { |number| p("#{number [0]}") }
p(eval("items [1]"))
p(binding.eval("items [0]"))
p(Object.new.instance_eval("items [1]"))
p(Class.new.class_eval("items [0]"))
def scoped
items = [3, 4]
binding
end
p(eval("items [1]", scoped))
def method_scope
"#{items [1]}"
end
p(method_scope)
Output:
"[:method, [[1]]]"
"20"
:"10"
/10/
"1"
20
10
20
10
4
"[:method, [[1]]]"