Array i [], slice

[code=ruby]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] #
end[/code]
Czy ktoś mógłby mi wytłumaczyć dlaczego metoda []/slice w klasie Array zachowuje się w taki sposób? Czytając dokumentację api wydawało mi się, że obie oznaczone linijki powinny zwrócić nil.

rb_range_beg_len tak po prostu działa:

[1,2,3,4].values_at(2…4) == [1,2,3,4].values_at(2…5) bo dla tej funkcji oba przedziały mają taką samą długość, rb_range_beg_len powinno sprawdzać n-1 ale nie robi tego, nie wiem dlaczego :wink:

Brzmi jak bug.

Który jest backportowany nawet do jruby :wink: ostatni post http://www.ruby-forum.com/topic/113902

[quote=Paweł Kondzior]rb_range_beg_len tak po prostu działa:

[1,2,3,4].values_at(2…4) == [1,2,3,4].values_at(2…5) bo dla tej funkcji oba przedziały mają taką samą długość, rb_range_beg_len powinno sprawdzać n-1 ale nie robi tego, nie wiem dlaczego ;)[/quote]
To co napisałeś jest dla mnie zupełnie jasne, ale nie dotyczy przypadku, który wskazałem. Tutaj używaż Range jako argumentu gdzie podajemy indeksy, które mają być uwgzlędnione, a nie indeks początkowy i ilość elemtnów (jak podałem w moim przykładzie).

[code=ruby]def test_array_slice
array = [‘a’, ‘b’, ‘c’]
assert_equal [‘c’], array[2…2]

assert_equal [], array[3…3] #
assert_equal nil, array[4…4] #
end[/code]
Dlaczego zakres 2…4 jest taki sam jak zakres 2…5 jest ok, problem polega na tym dlaczego zakres 3…3 nie jest takim sam jak 4…4.

Edit:
Po przeczytaniu wątku wskazanego przez Pawła przypomniał mi się obrazek: It’s not a bug, it’s a feature.

Można zgłosić bug i zobaczyć co powiedzą.

Ticket

W dokumentacji ten przypadek został fajnie opisany jako “special cases” bez wyjaśnienia dlaczego so special :slight_smile:

rb_range_beg_len to Iconv, Array, Range i String więc poprawienie nie jest łatwe zwłaszcza że zostało to już opisane jako edge case i programiści mogli się przyzwyczaić.

Przynajmniej special case został rozpoznany i może w dłuższym okresie czasu coś się uda z nim zrobić. Ruby 1.9.3 albo 2 albo coś… :slight_smile:

Czytałem dokumentację API przed założeniem ticketa, moim zdaniem jeśli to jest feature to słabo udokumentowany.