Issue #7947 has been reported by clicube (Cubing Cube). ---------------------------------------- Bug #7947: Queue#clear の返り値が Queue 内部の配列になっている https://bugs.ruby-lang.org/issues/7947 Author: clicube (Cubing Cube) Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 2.0.0dev (2013-02-24 trunk 39476) [x86_64-darwin11.4.2] ■現象 Queue#clear が def clear @que.clear end と実装されていて, Array#clear は self を返すので,結果的に内部の配列 @que が返っています. ■問題と思われること 1. 内部で使っている変数にアクセスできてしまいます. (これは instance_eval でアクセスしようと思えばできるわけですが) 2. Array も Queue も #push や #pop があるため, Queue#clear の返り値に対してメソッドチェーンで #push などを繋いだりすると, エラーが起こらないにもかかわらず内部の変数を直接書き換えてしまう可能性があると考えます. ■パッチについて 今回はQueue#clearで気づきましたが, QueueおよびSizedQueueのメソッドについて Array との対称性を考えると, ・Queue#push ・Queue#clear ・SizedQueue#push ・SizedQueue#clear は self が返るべきかと考えました. 以上4メソッドについて変更を加えるパッチを添付します. テストの実行結果は以下です. $ ./ruby -I./lib -I. test/thread/test_queue.rb Run options: # Running tests: Finished tests in 1.680776s, 7.1396 tests/s, 13.6842 assertions/s. 12 tests, 23 assertions, 0 failures, 0 errors, 0 skips ruby -v: ruby 2.0.0dev (2013-02-24 trunk 39476) [x86_64-darwin11.4.2] パッチのつくり方やテストの書き方/実行方法に自信がないのですが,これでいいのでしょうか. IRCで相談に乗っていただいた方々,ありがとうございました.
on 2013-02-24 18:39
on 2013-02-24 20:54
Issue #7947 has been updated by kosaki (Motohiro KOSAKI). Category set to core Status changed from Open to Assigned Assignee set to kosaki (Motohiro KOSAKI) Target version set to 2.1.0 review ok です。あとで簡単なテストして取り込んでおきます ---------------------------------------- Bug #7947: Queue#clear の返り値が Queue 内部の配列になっている https://bugs.ruby-lang.org/issues/7947#change-36958 Author: clicube (Cubing Cube) Status: Assigned Priority: Normal Assignee: kosaki (Motohiro KOSAKI) Category: core Target version: 2.1.0 ruby -v: ruby 2.0.0dev (2013-02-24 trunk 39476) [x86_64-darwin11.4.2] ■現象 Queue#clear が def clear @que.clear end と実装されていて, Array#clear は self を返すので,結果的に内部の配列 @que が返っています. ■問題と思われること 1. 内部で使っている変数にアクセスできてしまいます. (これは instance_eval でアクセスしようと思えばできるわけですが) 2. Array も Queue も #push や #pop があるため, Queue#clear の返り値に対してメソッドチェーンで #push などを繋いだりすると, エラーが起こらないにもかかわらず内部の変数を直接書き換えてしまう可能性があると考えます. ■パッチについて 今回はQueue#clearで気づきましたが, QueueおよびSizedQueueのメソッドについて Array との対称性を考えると, ・Queue#push ・Queue#clear ・SizedQueue#push ・SizedQueue#clear は self が返るべきかと考えました. 以上4メソッドについて変更を加えるパッチを添付します. テストの実行結果は以下です. $ ./ruby -I./lib -I. test/thread/test_queue.rb Run options: # Running tests: Finished tests in 1.680776s, 7.1396 tests/s, 13.6842 assertions/s. 12 tests, 23 assertions, 0 failures, 0 errors, 0 skips ruby -v: ruby 2.0.0dev (2013-02-24 trunk 39476) [x86_64-darwin11.4.2] パッチのつくり方やテストの書き方/実行方法に自信がないのですが,これでいいのでしょうか. IRCで相談に乗っていただいた方々,ありがとうございました.
on 2013-03-11 00:05
Issue #7947 has been updated by kosaki (Motohiro KOSAKI). committed at r39713 and r39714. ---------------------------------------- Bug #7947: Queue#clear の返り値が Queue 内部の配列になっている https://bugs.ruby-lang.org/issues/7947#change-37476 Author: clicube (Cubing Cube) Status: Assigned Priority: Normal Assignee: kosaki (Motohiro KOSAKI) Category: core Target version: current: 2.1.0 ruby -v: ruby 2.0.0dev (2013-02-24 trunk 39476) [x86_64-darwin11.4.2] ■現象 Queue#clear が def clear @que.clear end と実装されていて, Array#clear は self を返すので,結果的に内部の配列 @que が返っています. ■問題と思われること 1. 内部で使っている変数にアクセスできてしまいます. (これは instance_eval でアクセスしようと思えばできるわけですが) 2. Array も Queue も #push や #pop があるため, Queue#clear の返り値に対してメソッドチェーンで #push などを繋いだりすると, エラーが起こらないにもかかわらず内部の変数を直接書き換えてしまう可能性があると考えます. ■パッチについて 今回はQueue#clearで気づきましたが, QueueおよびSizedQueueのメソッドについて Array との対称性を考えると, ・Queue#push ・Queue#clear ・SizedQueue#push ・SizedQueue#clear は self が返るべきかと考えました. 以上4メソッドについて変更を加えるパッチを添付します. テストの実行結果は以下です. $ ./ruby -I./lib -I. test/thread/test_queue.rb Run options: # Running tests: Finished tests in 1.680776s, 7.1396 tests/s, 13.6842 assertions/s. 12 tests, 23 assertions, 0 failures, 0 errors, 0 skips ruby -v: ruby 2.0.0dev (2013-02-24 trunk 39476) [x86_64-darwin11.4.2] パッチのつくり方やテストの書き方/実行方法に自信がないのですが,これでいいのでしょうか. IRCで相談に乗っていただいた方々,ありがとうございました.
on 2013-04-03 19:23
Issue #7947 has been updated by nagachika (Tomoyuki Chikanaga). Status changed from Assigned to Closed 元の挙動はバグ扱いすべきものだとは思うので悩みましたけど、一応挙動が変化してしまうのでバックポートは見合わせようと思います。主なデメリットはメソッドチェーンができないということで、現在のバグに依存しているコードがある可能性と天秤にかけると 2.0.0 では互換性のほうに重きを置きたいと思います。 ---------------------------------------- Backport #7947: Queue#clear の返り値が Queue 内部の配列になっている https://bugs.ruby-lang.org/issues/7947#change-38181 Author: clicube (Hiroaki Yokose) Status: Closed Priority: Normal Assignee: nagachika (Tomoyuki Chikanaga) Category: Target version: ■現象 Queue#clear が def clear @que.clear end と実装されていて, Array#clear は self を返すので,結果的に内部の配列 @que が返っています. ■問題と思われること 1. 内部で使っている変数にアクセスできてしまいます. (これは instance_eval でアクセスしようと思えばできるわけですが) 2. Array も Queue も #push や #pop があるため, Queue#clear の返り値に対してメソッドチェーンで #push などを繋いだりすると, エラーが起こらないにもかかわらず内部の変数を直接書き換えてしまう可能性があると考えます. ■パッチについて 今回はQueue#clearで気づきましたが, QueueおよびSizedQueueのメソッドについて Array との対称性を考えると, ・Queue#push ・Queue#clear ・SizedQueue#push ・SizedQueue#clear は self が返るべきかと考えました. 以上4メソッドについて変更を加えるパッチを添付します. テストの実行結果は以下です. $ ./ruby -I./lib -I. test/thread/test_queue.rb Run options: # Running tests: Finished tests in 1.680776s, 7.1396 tests/s, 13.6842 assertions/s. 12 tests, 23 assertions, 0 failures, 0 errors, 0 skips ruby -v: ruby 2.0.0dev (2013-02-24 trunk 39476) [x86_64-darwin11.4.2] パッチのつくり方やテストの書き方/実行方法に自信がないのですが,これでいいのでしょうか. IRCで相談に乗っていただいた方々,ありがとうございました.
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.