ruby2.7からruby3への道

ruby 2.7 で動いているアプリケーションを ruby3で動くようにする。

といってもやることは RUBY_OPT="-W:deprecated" として テストを走らせて、出てくる警告をつぶしていくだけの簡単な作業です。

多かったのは warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call です。

def func(arg1, keyword_arg1:, keyword_arg2)
...
end 

のようなものを呼び出すときに

opts = { keyword_arg1: "arg1", keyword_arg2: "arg2"}

func("arg1, opts)

と呼んでいるものについて、 optsを **opts と展開してわたしなさい。

というもので、これは出た個所を淡々と書き換えていけばよいです。

似たようなものに warning: Passing the keyword argument as the last hash parameter is deprecated というのがあり、こちらは逆に

def func(arg1, hash_arg1)
hash_arg1["arg2"]...
end 

を呼び出す際に

func("arg1", arg2: "arg2", arg3: "arg3")

のように呼んでいるものについて、 {arg2: "arg2", arg3: "arg3"} のようにkeyword parameter ではなくちゃんとhash parameter にしてわたしなさい。

というものです。これも出た個所を淡々と書き換えてくだけです。

最後は warning: '_1' is reserved for numbered parameter; consider another name というやつで、

ruby 2.7から numbered parameter が導入され、 ruby3 で 1...9 が定義できなくなるというものです。

object.each { |_1,_2, arg, _3|
arg ...
}

というように、 ほしいところ以外を _num で埋めていたらそれが使えなくなっていました。 これは

object.each { |_arg1,_arg2, arg, _arg3|
arg ...
}

のように書き換えていくだけです。

これらを修正することで、rspecruby 3でも動くようになりました。