Feature #17724


Make the pin operator support instance/class/global variables

Added by jnchito (Junichi Ito) almost 2 years ago. Updated over 1 year ago.

Target version:


When I use pattern match with instance variables, I get an error message like "expecting local variable or method"

@n = 1
case 1
in ^@n
  # ...
#=> syntax error, unexpected instance variable, expecting local variable or method (SyntaxError)
#   in ^@n
#       ^~

However using method is not allowed, either.

def n = 1
case 1
in ^n
  # ...
#=> n: no such local variable (SyntaxError)

I think the message "expecting local variable or method" is confusing and should be fixed like "expecting local variable."

Updated by marcandre (Marc-Andre Lafortune) almost 2 years ago

Agreed. Ideally instance variable would be allowed, no?

Updated by ktsj (Kazuki Tsujimoto) almost 2 years ago

  • Status changed from Open to Assigned
  • Assignee set to ktsj (Kazuki Tsujimoto)

Updated by jeremyevans0 (Jeremy Evans) over 1 year ago

I've added a pull request to directly support instance/class/global variables with the pin operator:

You could already use all of those variables with the pin expression support by surrounding them in parantheses. However, since local variables and constants are supported, I think it makes sense to also support instance/class/global variables directly. I don't think it makes sense to support methods, as doing so is much more complex (arguments/blocks). Users can use the pin expression support for methods.

My approach to fixing this bug is really introducing a new feature so the bug reported (confusing error message) isn't a problem anymore. Since this changes the pattern matching syntax, it probably should be approved by both @ktsj (Kazuki Tsujimoto) and @matz (Yukihiro Matsumoto)).

Updated by ktsj (Kazuki Tsujimoto) over 1 year ago

  • Tracker changed from Bug to Feature
  • Subject changed from Pattern matching error message is confusing to Make the pin operator support instance/class/global variables
  • ruby -v deleted (ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20])
  • Backport deleted (2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN)

I think it makes sense to also support instance/class/global variables directly.

I agree.

What do you think, @matz (Yukihiro Matsumoto)?

Updated by matz (Yukihiro Matsumoto) over 1 year ago

Sounds reasonable. Accepted.


Actions #6

Updated by jeremyevans (Jeremy Evans) over 1 year ago

  • Status changed from Assigned to Closed

Applied in changeset git|fa87f72e1e84e2b55516be188f00434a683b924c.

Add pattern matching pin support for instance/class/global variables

Pin matching for local variables and constants is already supported,
and it is fairly simple to add support for these variable types.

Note that pin matching for method calls is still not supported
without wrapping in parentheses (pin expressions). I think that's
for the best as method calls are far more complex (arguments/blocks).

Implements [Feature #17724]


Also available in: Atom PDF