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.
[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=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).
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.
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ć.