Ни единого разрыва (об индексации массивов в питоне/руби)

Nov 06, 2016 17:38

В питоне и руби есть очень удобная штука: индексация элементов массива с конца: последний элемент доступен как arr[-1], предпоследний по arr[-2] итд. Так вот. Это удобно, но, на мой вкус, совершенно ужасно для динамических языков ( Read more... )

Leave a comment

Comments 13

itep November 6 2016, 17:22:41 UTC
В мире C++ есть rbegin, если уж хочется писать везде падающий безопасный код.

Reply

prijutme4ty November 6 2016, 17:25:31 UTC
В мире С++ много чего есть хорошего. Но зачем перенимать у него способы выстрелить в ногу?

Reply

itep November 6 2016, 17:32:04 UTC
Что именно ты считаешь хорошим?

Reply

prijutme4ty November 6 2016, 18:25:20 UTC
Что мне хотелось бы из плюсов забрать в другие языки (помимо производительности):
- гибкое переопроеделение оператоов
- возможность указать, какие методы не меняют объект (и какие объекты не будут изменяться в функции)
- система шаблонов, не затирающая типы при компиляции (на джаве от этого страдаю).

Это, конечно, не отменяет того, что в c++ много ужасов. Впрочем, я провел с ними достаточно много времени, чтобы меня эти проблемы не слишком напрягали. Только IO по-настоящему бесит.

Reply


dronte_l November 6 2016, 20:43:26 UTC
Ума не приложу, зачем нужно вычитать 1 из to. Разве что нужно специально не взять последний элемент.
Тогдf стоит использовать конструкцию arr[from:to][:-1].

Reply

prijutme4ty November 6 2016, 20:51:45 UTC
Да, конструкция, наверное, хорошая.
Ну вообще полно ситуаций, когда надо вычислить конец интервала, и он может получиться отрицательным. Самая банальная - раздуть интервал слева и справа на константу. Пишешь seq[from - flank:to + flank] и мигом получаешь что-нибудь отвратительное типа seq[-10:100510].

Reply

lodin November 6 2016, 22:41:28 UTC
Если постоянно возникает такая задача, я бы написать просто функцию n0(x) ("natural + zero") и юзал бы везде.

Reply

prijutme4ty November 6 2016, 22:54:30 UTC
Это не работает на другом конце, там нужно знать длину. И это все равно костыль.
Ну это же мрак, что всякий раз, когда есть сомнения в знаке, есть шанс улететь черт те куда и даже не узнать об этом, типичный си. Уж на что я не любил матлаб, но написать три буквы для индексации с конца для мне никогда не было проблемой.

Ну и какие-такие функции? Половина кода в последнее время у меня - это скрипты, заинлайненные в баш-команду. :)

Reply


lodin November 6 2016, 22:23:05 UTC
Я бы сказал, что как раз array[:-1] - godsend для quick and dirty.

Reply

prijutme4ty November 6 2016, 22:37:03 UTC
Разумеется. Но это не повод делать косячный механизм, когда можно сделать почти столь же удобную альтернативу, не имеющую идиотского побочного эффекта.

Reply


slobin November 7 2016, 01:04:29 UTC
// Это может сделать несолько более сложным переопределение оператора индексации.

В dlang это (там это называется не end, а $) считается хитрым синтаксисом для унарной операции "длина массива", которую можно переопределить (её, а не оператор индексации). На самом деле чуть хитрее: второй compile-time аргумент "номер индекса" (если у вас двумерный массив, и по каждой координате свой end), но в целом вроде так. Подробностей не знаю, сам недавно в документации прочитал. :-)

(тут была ссылка на документацию, но ЖЖ все посторонние ссылки считает спамом! убивать!)

... Художественная самодеятельность ...

Reply

prijutme4ty November 7 2016, 09:05:10 UTC
Занятно... Оператор, который обретает смысл только внутри квадратных скобок. Но все-таки удобнее, чтобы $ был самостоятельным объектом. Тогда его можно будет записать в переменную и использовать в индексации её.
Кстати, только сейчас узнал, что в питоне слайсы в переменную все таки можно записать. Из синтаксиса неочевидно.

Reply


Leave a comment

Up