[ruby-list:50885] Re: パターンマッチングの値について

From: Kazuki Tsujimoto <kazuki@...>
Date: 2020-05-16 15:30:58 UTC
List: ruby-list #50885
パターンマッチ設計者の辻本といいます。

Subject: [ruby-list:50884] パターンマッチングの値について
From: OOTANI TAKASHI <tksotn@mail.117.cx>
Date: Sun, 10 May 2020 20:10:36 +0900

> Ruby2.7のパターンマッチングなのですが、
> 
> A in B
> 
> の値は、マッチが成功したときに nil になるのはどういう意図なのでしょうか?

正確に言えば、

  成功時: 原則、値を返さない(※)。値を返すことが避けられない場合はnilを返す。
  失敗時: NoMatchingPatternErrorとなる。

というのが2.7での仕様になります。

実は2.7.0-preivew3までは

  成功時: trueを返す。
  失敗時: falseを返す。

という仕様だったのですが、Feature #16355の議論で変更になりました。
詳細については、そちらを確認していただくとよいと思います。

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

端的にまとめると、A in B(以下、in式)のマッチの成否をtrue/falseで返す仕様とした場合、
in式をifの条件部分などに書くのではなく単独の式として書くような使い方をすると
マッチの失敗に気づくすべがないためです。

このため、失敗時には例外になるようにし、また、その変更に伴い成功時には値を返さないようになりました。

※
たとえば、

  a = (0 in 0)

というコードを実行しようとすると、void value expressionというコンパイルエラーになります。

---

少し話は脱線しますが、in式を導入した動機の一つには、
RubyでJavaScriptの分割代入(destructuring assignment)のようなことができるようになると
JSONの分解などでカジュアルに使いやすいのではないかというものがありました。

  # Ruby
  {a: 0, b: 1} in {a:}

  # JavaScript
  let {a} = {a: 0, b: 1}

ただ、2.7リリース後の実際のユースケースを眺めていると、
このような使い方をしているような事例はほとんど無いような状況です。

このため、3.0ではin式自体を取り下げて、改めて仕様を再検討するというようにしてもいいのではないかと思っています。
(あくまで個人的に考えているだけなので、最終的にどうなるかは分かりませんが)

-- 
Kazuki Tsujimoto

In This Thread