ruby-trunk-changes 2019-08-31

今日はキーワード引数の将来(3.0?)の完全分離のために前段階として keyword rest 引数とオプション引数(通常の引数の最後に Symbol をキーにした Hash を渡すような形式)を keyword splat (**h のように2つのアスタリスクで Hash を展開してキーワード引数として渡す記法)や通常の引数として最後に Hash を渡す形式の相互の変換と、将来サポートされなくなる変換時の警告出力の追加、および明示的にキーワード引数を受けとらないことを宣言するメソッド定義の **nil という記法の追加などがありました。
キーワード引数の仕様変更についてはかなり込み入っているので正確なところは [Feature #14183] "Real" keyword argument を参照してください。ユーザーとしては、今後はメソッド定義もメソッド呼び出しもキーワード引数として定義/呼び出しするようにして、2.7 で警告が出るようになってたら 3.0 の前に対応する、っていうところでしょうか。

[16c6984bb9] Yusuke Endoh 2019-03-18 05:25:47 UTC

キーワード引数の扱いについていくつか根本的な変更が行なわれているようです。まず引数の最後の Hash を暗黙のうちキーワード引数への keyword-splat として扱うのは警告を出すようにしているようです。他にもいろいろあるけど、ここからはじまる一連のコミット群はその試行錯誤の経過みたいなので、最後のほうテストが入ったところで仕様の変更点は確認しようと思います。

[334b41a46b] Jeremy Evans 2019-04-01 19:15:01 UTC

16c6984bb97409029e213154ac4f633ae04af3d8 の追加修正でキーワード引数をもたないメソッドへ ** で keyword splat で Hash を渡す記法を許容し、その場合は警告を出しつつ通常の引数の最後にこの Hash をそのまま渡すようにしています。ただし Hash が空の場合は追加しません。

[3f67fcd3d5] Jeremy Evans 2019-04-07 18:38:21 UTC

334b41a46b2a1a72965494dcecc6fe73a83f4490 の警告出力の条件を修正。

[d08e1004e0] Jeremy Evans 2019-04-07 23:44:49 UTC

標準添付ライブラリで 16c6984bb97409029e213154ac4f633ae04af3d8 のキーワード引数の仕様変更のためにメソッド呼び出しの最後の Hash 引数に明示的な ** を追加するようにしています。

[e0b4599bba] Jeremy Evans 2019-04-07 23:55:34 UTC

test/ 配下で 16c6984bb97409029e213154ac4f633ae04af3d8 以降の keyword 引数の変更による警告の抑制のためメソッド呼び出しの最後の Hash 引数に明示的な ** の指定を追加しています。

[9c2e165f7d] Jeremy Evans 2019-04-08 01:45:26 UTC

16c6984bb97409029e213154ac4f633ae04af3d8 の最後の引数が Hash だったら自動的に keyword splat したものとして扱う処理はその Hash の key が全て Symbol だった時だけ行うようにしています。

[03697ddf63] Jeremy Evans 2019-04-08 01:48:43 UTC

テストで 16c6984bb97409029e213154ac4f633ae04af3d8 からの変更での警告に対応。

[15bca0d4d3] Jeremy Evans 2019-04-08 01:49:55 UTC

16c6984bb97409029e213154ac4f633ae04af3d8 からのキーワード引数の処理変更で Symbol でないキーをもつ Hash を ** で keyword splat した時の例外が ArgumentError に変更されたのでテストを追随させています。

[896e42d93f] Jeremy Evans 2019-04-09 01:45:50 UTC

16c6984bb97409029e213154ac4f633ae04af3d8 からのキーワード引数の扱い変更続き。 通常引数の最後が Hash だった時で、key が Symbol とそうでないもので分離して、Symbol のほうだけ keyword splat するようにしています。またこの時警告を出力するようにしています。えー、なるほど?

[afae8555da] Jeremy Evans 2019-04-09 02:45:54 UTC

internal.h の rb_hash_stlike_foreach() の宣言を MJIT 用に export するようにしています。

[6a9ce1fea8] Jeremy Evans 2019-04-19 13:19:41 UTC

メソッド定義の時の keyword splat に m(**nil) のように nil を指定するのを許容するようにしています。こうすることで明示的にキーワード引数がないことを宣言して 、メソッド呼び出し時にキーワード引数を渡そうとしたら例外発生させられるようにしています。

[4d64693c70] Jeremy Evans 2019-04-24 17:34:02 UTC

6a9ce1fea89bc5c6518dd6bb7ff3b824a9321976 の m(**nil) の文法を拡張ライブラリ ripper でも対応するようにしています。

[fa41a7b260] Jeremy Evans 2019-04-24 18:40:02 UTC

RubyVM::AbstractSyntaxTree::Node#children で 6a9ce1fea89bc5c6518dd6bb7ff3b824a9321976 の m(**nil) の文法に対応するようにしています。おお、細かいところを見逃さない。すごい。

[3a23b71f0a] Jeremy Evans 2019-04-24 19:06:39 UTC

Method#parameters メソッドでも m(**nil) と明示的にキーワード引数を拒否する記法が使われてたら :nokey という Symbol で表すように対応しています。おお。ここまで気がつくとは。

[8399609e5a] Jeremy Evans 2019-08-16 19:43:13 UTC

vm_args.c の keyword_hash_split() を static に変更しています。

[5c507db467] Jeremy Evans 2019-08-18 05:43:26 UTC

キーワード引数を受け付けるけど keyword rest 引数はないように定義されたメソッドに keyword splat で Hash を渡す記法でメソッド呼び出ししたら警告した上で最後の引数にこの Hash を渡すようにしています。

[16cd0de6ec] Jeremy Evans 2019-08-18 05:47:43 UTC

896e42d93f52966644c2700ed9fd18f2a1988dd3 の splat hash に渡した Hash のキーごとに分離する処理で先に dup するようにして渡さらた Hash を破壊的に変更してしまわないようにしています。

[a810f6cbef] Jeremy Evans 2019-08-18 05:49:04 UTC

rubyspec でキーワード引数の挙動による警告を 2.7の時に抑制するようにしています。

[42adc5bc6b] Jeremy Evans 2019-08-20 19:28:04 UTC

16c6984bb97409029e213154ac4f633ae04af3d8 の変更のうち parse.y の変更がキーワード引数の重複の警告が出なくなってしまっていたのでそこだけ revert しています。

[856bb3c35d] Jeremy Evans 2019-08-20 19:29:51 UTC

16c6984bb97409029e213154ac4f633ae04af3d8 からの一連のキーワード引数の変更でのテストの警告を除去するためメソッド定義を修正したり、assert_warn で警告が出ることを確認するようにしたりしています。

[b5b3afadfa] Jeremy Evans 2019-08-30 18:52:46 UTC

16c6984bb97409029e213154ac4f633ae04af3d8 からのキーワード引数の仕様変更で bundler に vendoring している thor のメソッド定義を修正しています。

[38e08db48e] git 2019-08-30 19:39:56 UTC

version.h の日付更新

[a1e588d1a7] Yusuke Endoh 2019-08-30 22:03:27 UTC

16c6984bb97409029e213154ac4f633ae04af3d8 からのキーワード引数についての変更を NEWS ファイルに追記しています。やっぱり RubyKaigi 2019 で話されてたキーワード引数の整理についての変更だったんですね。 [ruby-core:84255] [Feature #14183]

[8cb9efbbe6] Yusuke Endoh 2019-08-30 22:17:46 UTC

tool/rbinstall.rb でもキーワード引数の変更による警告抑制のためメソッド定義を修正しています。

[6424d316b9] Jeremy Evans 2019-08-31 00:33:33 UTC

キーワード引数がないメソッドに keyword splat で Hash を渡して通常引数に変換される時の警告を逆に削除しています。

[3463e83192] Jeremy Evans 2019-08-31 02:23:10 UTC

keyword rest 引数がないメソッドにキーワード引数を渡して呼び出した結果、通常引数の最後の Hash に追加でこのキーワード引数の key を追加する時に警告するようにしています。 [ruby-core:83881] [Bug #14130]

[ec6206a81a] Jeremy Evans 2019-08-31 04:56:50 UTC

キーワード引数関係の警告でよる詳細なソースコード上の位置情報を出すようにしています。そのため iseq_location() を MJIT 用に export するようにしています。

[60a08d9a6c] Jeremy Evans 2019-08-31 05:11:00 UTC

ec6206a81a1d61efe5bda69ab704c09e75033c01 で iseq_location() を export していましたが、export する関数は rb_ と prefix をつけるという慣習に従うため iseq_location() は static に戻して rb_iseq_location() という wrapper 関数を追加してこちらを export して vm_args.c から利用するようにしています。

[d7aa1260b6] Nobuyoshi Nakada 2019-08-31 05:44:57 UTC

tool/lib/vcs.rb でパッケージ作成のため VCS::SVN で export した後 .gitignore など .git で始まるファイルを削除するようにしています。

[4868ad7e5b] 卜部昌平 2019-08-31 04:31:21 UTC

e4be2fda3dbbfdb1f2ace697c96cf6bdd7dfef21 で mingwGCC 拡張を用いたメソッド定義系関数の引数の数ごとに定義をわけるのがうまくいかないので undef するようにしていましたが、これでは CI のエラーが回避できなかったようで定義するところに !defined(_WIN32) の条件を追加して Windows 環境ではこの手法は元から使わないようにしています。

[1f18b578ce] Jeremy Evans 2019-08-31 06:50:50 UTC

空の Hash を keyword splat つきで渡して m(**h) のように渡してメソッド呼び出しした時にそのメソッドの通常引数の最後に Hash オブジェクトとして追加する挙動をしないようにしています。

[58a373e9ed] Takashi Kokubun 2019-08-31 07:44:41 UTC

.travis.yml の古い BASERUBY を使ったビルドのテストで apt-get update のオプションに --allow-unauthenticate を渡すようにしています。

[3868df8333] Takashi Kokubun 2019-08-31 08:03:26 UTC

58a373e9ed54556e18a13825dfe72d3f7a86b833 の続き。 --allow-unauthenticate を渡すのではだめだったみたいで apt-get update 前に apt-get install debian-keyring debian-archive-keyring を実行するようにしています。

[8897fa60fd] Takashi Kokubun 2019-08-31 08:18:00 UTC

3868df83330bb897be996604df3862639abbf002 でもまだだめだったみたいで Travis-CI の addon のパッケージ source の設定を利用するようにしてるようです。

[602fbd4338] Takashi Kokubun 2019-08-31 08:34:23 UTC

8897fa60fdbc83f9cce7df384893e902c17c1bf2 でインストールがうまくいったようなのですが addon は無効にしたいので 再度コメントアウトして apt-add-repository というコマンドを実行することで同様の効果が得られるか試しています。