From 4115270e529179bed57976b4326fb499477c0c1b Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Mon, 24 Jun 2019 13:55:31 -0700 Subject: [PATCH] Document local variable interactions with eval Fixes [Bug #13337] --- doc/syntax/assignment.rdoc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/doc/syntax/assignment.rdoc b/doc/syntax/assignment.rdoc index 83300cbece..76a762a4e2 100644 --- a/doc/syntax/assignment.rdoc +++ b/doc/syntax/assignment.rdoc @@ -109,6 +109,28 @@ The confusion comes from the out-of-order execution of the expression. First the local variable is assigned-to then you attempt to call a nonexistent method. +== Local Variables and eval + +Using +eval+ to evaluate Ruby code will allow access to local variables in +the same scope, even if if the local variables are not assigned until after +the call to +eval+. However, local variables set inside the call to +eval+ +will not be reflected in the surrounding scope. Inside the call to +eval+, +local variables in the scope and local variables defined inside the call to ++eval+ will be accessible. However, you will not be able to access local +variables assigned in previous or subsequent calls to +eval+ in the same +scope. Consider each +eval+ call a separate nested scope. Example: + + def m + eval "bar = 1" + lvs = eval "baz = 2; ary = [local_variables, foo, baz]; x = 2; ary" + eval "quux = 3" + foo = 1 + lvs << local_variables + end + + m + # => [[:baz, :ary, :x, :lvs, :foo], nil, 2, [:lvs, :foo]] + == Instance Variables Instance variables are shared across all methods for the same object. -- 2.21.0