From: Marc-Andre Lafortune Date: 2011-04-08T03:01:46+09:00 Subject: [ruby-core:35643] [Ruby 1.9 - Bug #4541] Inconsistent Array.slice() Issue #4541 has been updated by Marc-Andre Lafortune. Hi, On Tue, Apr 5, 2011 at 3:04 AM, Yui NARUSE wrote: > > Issue #4541 has been updated by Yui NARUSE. > > Status changed from Open to Assigned > Assignee set to Yukihiro Matsumoto > > The fix may be following but it can be a spec... > > diff --git a/array.c b/array.c > index bdeb768..4721387 100644 > --- a/array.c > +++ b/array.c > @@ -948,7 +948,7 @@ rb_ary_subseq(VALUE ary, long beg, long len) > ��{ > �� �� VALUE klass; > > - �� ��if (beg > RARRAY_LEN(ary)) return Qnil; > + �� ��if (beg >= RARRAY_LEN(ary)) return Qnil; > �� �� if (beg < 0 || len < 0) return Qnil; > > �� �� if (RARRAY_LEN(ary) < len || RARRAY_LEN(ary) < beg + len) { With all due respect, I am strongly opposed to that change. There is no way that the following results should change: array[0...3] # => ["a", "b", "c"] array[1...3] # => ["b", "c"] array[2...3] # => ["c"] array[3...3] # => [], as it *must* be. The only possible change would be that array[42..42] returns [] instead of nil. For consistency's sake, `String#slice` would also have to be changed. I am not in favor of that change either, for compatibility reason and because I feel the current API makes sense. See my comment on issue #4245 [ruby-core:34197]. This issue is a duplicate of #4245. ---------------------------------------- Bug #4541: Inconsistent Array.slice() http://redmine.ruby-lang.org/issues/4541 Author: Marcin Pietraszek Status: Assigned Priority: Normal Assignee: Yukihiro Matsumoto Category: Target version: 1.9.2 ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-linux] Array slice/[] method is a bit inconsistent. Is it just poorly documented "feature" or a bug? In API doc I can't find this behaviour mentioned as a "special case". def test_array_slice array = ['a', 'b', 'c'] assert_equal nil, array[3] assert_eaual nil, array[4] assert_eaual [], array[3, 0] # assert_equal nil, array[4, 0] # [] expected (or both nils in array[3, 0] and array[4, 0]) assert_equal ['c'], array[2..2] assert_equal [], array[3..3] # assert_equal nil, array[4..4] # [] expected (or both nils in array[3..3] and array[4..4]) end Same behaviour can be reproduced on ruby 1.8.7 (2010-12-23 patchlevel 330) [x86_64-linux]. -- http://redmine.ruby-lang.org