From: xkernigh@netscape.net
To: ruby-core@ruby-lang.org
Subject: [ruby-core:95525] [Ruby master Bug#16251] Evaluation in binding differs from ruby execution
Date: Thu, 24 Oct 2019 02:37:37 +0000 (UTC) [thread overview]
Message-ID: <redmine.journal-82300.20191024023736.2fde530c18f2db36@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-16251.20191015131939@ruby-lang.org
Issue #16251 has been updated by kernigh (George Koehler).
This is a simpler example of the behavior:
```
$ ruby -e 'p x; x = 6'
Traceback (most recent call last):
-e:1:in `<main>': undefined local variable or method `x' for main:Object (NameError)
$ ruby -e 'p eval("x"); x = 6'
nil
$ ruby -e 'p binding.eval("x"); x = 6'
nil
```
A plain `x` raises NameError, but an `eval("x")` or `binding.eval("x")` fetches nil from the local variable x. I expect this behavior, because Ruby parses a script before running it:
1. Ruby parses `x = 6` and adds x to the binding.
2. Ruby runs `eval("x")` with x in the binding.
3. Ruby runs `x = 6` and changes the value of x from nil to 6.
Binding#local_variables reveals the local variable named x:
```
$ ruby -e 'p binding.eval("x"); x = 2'
[:x]
```
Because x exists, `binding.eval("x")` has the expected behavior, so there is no bug.
----------------------------------------
Bug #16251: Evaluation in binding differs from ruby execution
https://bugs.ruby-lang.org/issues/16251#change-82300
* Author: teslur (Tetsushi FUKABORI)
* Status: Closed
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
In specific situation, I found that result of string evaluation in Binding returns different from ruby execution result.
In following sample code, ruby evaluates `method_or_local_var` as method call and returns `"method"`.
However, `binding.eval` evaluates `method_or_local_var` as local variable and returns `nil`.
Here is sample code.
```
def method_or_local_var
'method'
end
if true
puts "execute method_or_local_var:"
p method_or_local_var #=> "method"
puts "execute method_or_local_var by bind.eval('method_or_local_var'):"
p binding.eval('method_or_local_var') #=> nil
else
method_or_local_var = 'local variable'
end
```
and here is results of execute sample code.
```
❯ ruby sample_code.rb
execute method_or_local_var:
"method"
execute method_or_local_var by bind.eval('method_or_local_var'):
nil
```
I expect evaluation result of `method_or_local_var` in binding to be method, and returns `"method"`.
Is this the expected behavior?
--
https://bugs.ruby-lang.org/
prev parent reply other threads:[~2019-10-24 2:37 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <redmine.issue-16251.20191015131939@ruby-lang.org>
2019-10-15 13:19 ` [ruby-core:95332] [Ruby master Bug#16251] Evaluation in binding differs from ruby execution teslur
2019-10-15 13:48 ` [ruby-core:95333] " mame
2019-10-15 20:27 ` [ruby-core:95347] " eregontp
2019-10-24 2:37 ` xkernigh [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.ruby-lang.org/en/community/mailing-lists/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=redmine.journal-82300.20191024023736.2fde530c18f2db36@ruby-lang.org \
--to=ruby-core@ruby-lang.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).