Issue #16372 has been updated by jnchito (Junichi Ito).


shevegen (Robert A. Heiler) wrote:
> If I understood you correctly then the suggestion is to allow both local and
> instance variables become assignable, when before pattern matching would only
> be possible to local variables, yes?

Yes, correct. And people might want to use @@variables and $variables too (I rarely use them, though) .

----------------------------------------
Feature #16372: Allow pattern matching to bind instance variables
https://bugs.ruby-lang.org/issues/16372#change-82808

* Author: jnchito (Junichi Ito)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
I tried this code, but got sytax error:

```ruby
case [1, 2]
in @a, @b
end
```

```
syntax error, unexpected instance variable, expecting '}'
    in @a, @b
       ^~
```

I think it would be more useful if we could bind instance variables with pattern matching.

## Use case

I understand this is not Rails way, but we have some codes like this:

```ruby
def Foo.create_foo(params)
  if valid?(params)
    [:ok, create(params)]
  else
    [:ng, nil]
  end
end

class FooController < ApplicationController
  def create
    result, @foo = Foo.create_foo(foo_params)

    case result
    when :ok
      redirect_to @foo
    when :ng
      # @foo will be used in view
      render :new
    else
      raise "Unknown result: #{result}"
    end
  end
end
```

I thought I could make it simpler with pattern matching (but impossible):

```ruby
class FooController < ApplicationController
  def create
    case Foo.create_foo(foo_params)
    in :ok, @foo
      redirect_to @foo
    in :ng, _
      render :new
    end
  end
end
```





-- 
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>