Issue #10661 has been updated by Xavier Shay.


This is going to warn for most RSpec suites. The following pattern is common (I have it in all of my projects) due to the common `let` extraction myron talks about:

(sample of a spec from one of my projects - you can also see this in the RSpec commit Myron linked)

```
describe Event do
  describe '#complete!' do
    it 'marks event as complete' do
      event = Fabricate(:event)
      event.complete!
      expect(event.reload.ran?).to eq(true)
    end
  end

  describe '#set_handicap!' do
    let!(:event) { Fabricate(:event, distance: Distance.km(3)) }
    let!(:runs) { [
      Fabricate(:run,
        event:      event
      )
    ]}
    it 'updates a handicap and start time for a run' do
      run = event.set_handicap!(runs[1].competitor_id, 300)

      # ...
    end
  end
end
```

> While I can understand the kinds of errors this warnings helps you avoid

I'm not so convinced on this. The test included with the change already breaks in a fairly obvious way. I haven't seen this class of problem affect any of my newer developers*, and I speculate that the warning might be too technical to be obvious to newer developers anyway - "scope" is a more advanced term.

Put another way: I'd like to see a stronger case made for this change (or any "less strict" version) that justifies breaking such a common pattern.

*yes, this is a small sample!

----------------------------------------
Bug #10661: The "possible reference to past scope" warning is quite frustrating and is forcing me to change my variable names from what I want
https://bugs.ruby-lang.org/issues/10661#change-50688

* Author: Myron Marston
* Status: Open
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* ruby -v: ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin12.0]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
I find the change in r48986 to be quite frustrating.  It's forcing me to change many of my variable and/or method names if I want to keep my ruby code warning free (which is a thing we enforce in the RSpec code base).

The problem I see is that, in my experience, it's quite common to use the same name for a local variable in one part of a file that you later use for an arg-less method name at a later part in the file.

Consider this ruby command:

~~~
ruby -w -e '[1, 2, 3].sample.tap { |rand| puts "Random value: #{rand}" }; puts "Another random value: #{rand}"'
~~~

This produces:

~~~
-e:1: warning: possible reference to past scope - rand
Random value: 1
Another random value: 0.7483347748677992
~~~

Changing the `rand` call to `self.rand` is one solution I would consider to avoid the warning, but it doesn't work here because `rand` is `private` (as it comes from `Kernel`), so I'm forced to change the block local variable name to a name I do not want.

In RSpec it's an even bigger issue as it's quite common to have a common name for a certain collaborator role in your tests where in some cases there's a helper method (often defined using `let`) that exposes an object for that role and in other tests you might build it in-line and assign it to a local.  In our rspec-mocks test suite, we had 280 warnings from this.  I went through and changed many variable and method names to names I do not like as much (e.g. `the_dbl` instead of `dbl` or `klazz` instead of `klass`) simply to avoid this warning:

https://github.com/rspec/rspec-mocks/commit/3b909ed1a951bbca340ea98c27ab65da7f43881c

While I can understand the kinds of errors this warnings helps you avoid, I think that it is too strict and noisy in its current form.




-- 
https://bugs.ruby-lang.org/