From: xkernigh@... Date: 2019-10-24T02:37:37+00:00 Subject: [ruby-core:95525] [Ruby master Bug#16251] Evaluation in binding differs from ruby execution 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 `
': 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/ Unsubscribe: