Forum: Ruby-dev [ruby-trunk - Bug #7947][Open] Queue#clear の返り値が Queue 内部の配列になっている

Posted by clicube (Cubing Cube) (Guest)
on 2013-02-24 18:39
(Received via mailing list)
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で相談に乗っていただいた方々,ありがとうございました.
Posted by kosaki (Motohiro KOSAKI) (Guest)
on 2013-02-24 20:54
(Received via mailing list)
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で相談に乗っていただいた方々,ありがとうございました.
Posted by kosaki (Motohiro KOSAKI) (Guest)
on 2013-03-11 00:05
(Received via mailing list)
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で相談に乗っていただいた方々,ありがとうございました.
Posted by nagachika (Tomoyuki Chikanaga) (Guest)
on 2013-04-03 19:23
(Received via mailing list)
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
No account? Register here.