Ruby 2.7 の変更点 - rescue 節の優先度 / 特異クラス内定義の yield

Ruby 2.7 アドベントカレンダーの12日目の記事です。

qiita.com

rescue 節の優先度

代入文で後置 rescue を使用した時に多重代入の時だけ突飛な動きをしてましたが、

a = raise rescue 123
a  #=> 123

a = raise rescue [123, 456]
a  #=> [123, 456]

a = b = 0
a, b = raise rescue [123, 456]
a  #=> 0  ???
b  #=> 0  ???

a = b = 0
a, b = (raise rescue [123, 456])
a  #=> 123
b  #=> 456

2.7 では期待通りに動くようになります。

a = b = 0
a, b = raise rescue [123, 456]
a  #=> 123
b  #=> 456

特異クラス内定義の yield

今までメソッド内の特異クラス定義内の yield がメソッドのコンテキストで実行されるという不思議な挙動をしていたようですが、warning が出るようになりました。

class A
  def hoge
    class << self
      yield   #=> warning: `yield' in class syntax will not be supported from Ruby 3.0. [Feature #15575]
    end
  end
end

A.new.hoge { p 123 }  #=> 123

warning の通り、3.0 ではサポートされなくなるようです。

ていうかこんなのに依存してるコードなんてないですよね、たぶん…。