[ruby-list:50863] Re: v2.7でのキーワード引数について

From: Yusuke Endoh <mame@...>
Date: 2019-12-29 07:42:16 UTC
List: ruby-list #50863
遠藤といいます。

これはバグですね。必要ない警告でした。
Structのinitializeをオーバーライドしてキーワード引数を受け取るようにする、
というのが想定できてなかったです。
手元で修正は作れたので、たぶん2.7.1で直ります。

さしあたっての対応としては、keyword_init を使うことで回避できなくはないです。

Sample2 = Struct.new(:s1, :s2, :s3, keyword_init: true) do
    def initialize(a1:, a2:)
        super(s1: a1, s2: a2, s3: a1 + a2)
    end
end
p Sample2.new(a1:1, a2:2)

ご迷惑をおかけします。

2019年12月29日(日) 16:00 大田黒 俊夫 <toshio.otaguro@gmail.com>:

> Ubuntu の snap でインストールした Ruby を使っていますが,本日自動的に v2.7 にアップデートされました.バージョン表記では
> ruby 2.7.0dev (2019-12-25 master e1e1d92277) [x86_64-linux]
> と表示されて,微妙にリリース版ではないように見えるのが気になります.
>
> さて,キーワード引数に関する警告が出るようになりました.リリースノートにいろいろ書いてあるのを読んでもよく理解できなかったので,ここで質問します.
>
> Sample1 = Struct.new(:s1, :s2, :s3) do
> def initialize(a1, a2)
> super(a1, a2, a1 + a2)
> end
> end
> p Sample1.new(1, 2)
>
> Sample2 = Struct.new(:s1, :s2, :s3) do
> def initialize(a1:, a2:)
> super(a1, a2, a1 + a2)
> end
> end
> p Sample2.new(a1:1, a2:2)
>
> 上記のスクリプトを v2.7 で実行すると,
>
> #<struct Sample1 s1=1, s2=2, s3=3>
> kwarg_01.rb:13: warning: Using the last argument as keyword parameters is
> deprecated; maybe ** should be added to the call
> kwarg_01.rb:9: warning: The called method `initialize' is defined here
> #<struct Sample2 s1=1, s2=2, s3=3>
>
> という警告が出て,Sample2 のキーワード引数が非推奨と言われてしまいます.構造体には正しく代入されているようです.
>
> 私はキーワード引数を多用していますが,最後の引数に使わないほうが良い理由は何でしょうか?最も簡単な回避策はどのようなものでしょうか?どなたかご教示いただければ幸いです.
>
> 俊(とし)
>

In This Thread