Issue #14785 has been updated by jeremyevans0 (Jeremy Evans).


jacobevelyn (Jacob Evelyn) wrote:
> I agree the `did_you_mean` message is not good, but I would rather change the behavior so that line of code works and doesn't produce an error at all.

Doing that would change the behavior of code that currently works:

~~~ ruby
def calculate_result
  :calculate_result
end

def result
  :result
end

def test
  return result if result = calculate_result
  :test
end
~~~

Currently, `test` returns `:result`.  With the change you are proposing, `test` would return `:calculate_result`.

----------------------------------------
Feature #14785: Parse guard statements like regular conditionals
https://bugs.ruby-lang.org/issues/14785#change-72245

* Author: jacobevelyn (Jacob Evelyn)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
I just learned that these two pieces of code are not the same:

~~~ ruby
def test
  if result = calculate_result
    return result
  end

  ...
end
~~~

~~~ ruby
def test
  return result if result = calculate_result

  ...
end
~~~

The second one will give this unhelpful error message:

~~~
NameError: undefined local variable or method `result' for main:Object
Did you mean?  result
~~~

I think this is confusing, especially since tools like RuboCop sometimes encourage users to change conditionals to inline ones ("guard statements"). I'd like to propose that Ruby be changed to treat these as the same.



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

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>