From: nobu@... Date: 2017-06-13T13:39:33+00:00 Subject: [ruby-core:81662] [Ruby trunk Bug#10314] Default argument lookup fails in Ruby 2.2 for circular shadowed variable names Issue #10314 has been updated by nobu (Nobuyoshi Nakada). olivierlacan (Olivier Lacan) wrote: > Also, wasn't `def run(foo = self.foo)` a viable alternative to `def run(foo = foo())` to avoid circular reference warnings? Unless `#foo` is private. > Empty parens tend to trigger errors from tools like Rubocop. Then you should report it to Rubocop, not here. ---------------------------------------- Bug #10314: Default argument lookup fails in Ruby 2.2 for circular shadowed variable names https://bugs.ruby-lang.org/issues/10314#change-65356 * Author: lsegal (Loren Segal) * Status: Open * Priority: Normal * Assignee: nobu (Nobuyoshi Nakada) * Target version: 2.2.0 * ruby -v: 2.2.0-preview1 * Backport: 2.0.0: DONTNEED, 2.1: DONTNEED ---------------------------------------- The following code prints `nil` in Ruby 2.2.0-preview1 but worked in all previous version of Ruby back to 1.8.7: ~~~ class Foo def foo; "abc" end # this default param should resolve at runtime to the #foo method call def run(foo = foo) p foo # print shadowed local var defaulting to attr value end end puts "Testing #{RUBY_VERSION}:" Foo.new.run # Ruby 2.2.0-preview1 # => nil # Ruby 1.x 2.x etc # => "abc" ~~~ My guess is this is happening because "foo" in "foo = foo" is resolving to the argument variable "foo", which currently has the value of nil. It would be equivalent to setting "qux = qux" in a method body, which has been the expected behavior for a long time. I understand that shadowing variables is something you should probably never do, but unfortunately this code was already written and working for quite a while, so I figured it would be wise to file a bug report for the following reasons: 1. This seems like a breaking change in Ruby 2.2.0-preview1 that was not announced in the changelog. My guess is this change may have been unintentional, but if it was we need a changelog entry at the very least. 2. If this is newly expected behavior, I wanted to chime in that I don't think it makes much sense. I can't think of any time when a user would expect the default value of a "foo = foo" argument to be the same foo argument itself. That would be tautologically nil. Arguably, it doesn't make much sense inside of a method body either when there is a shadowed method that could be called instead. -- https://bugs.ruby-lang.org/ Unsubscribe: