В питоне и руби есть очень удобная штука: индексация элементов массива с конца: последний элемент доступен как arr[-1], предпоследний по arr[-2] итд. Так вот. Это удобно, но, на мой вкус, совершенно ужасно для динамических языков
( Read more... )
Что мне хотелось бы из плюсов забрать в другие языки (помимо производительности): - гибкое переопроеделение оператоов - возможность указать, какие методы не меняют объект (и какие объекты не будут изменяться в функции) - система шаблонов, не затирающая типы при компиляции (на джаве от этого страдаю).
Это, конечно, не отменяет того, что в c++ много ужасов. Впрочем, я провел с ними достаточно много времени, чтобы меня эти проблемы не слишком напрягали. Только IO по-настоящему бесит.
Ума не приложу, зачем нужно вычитать 1 из to. Разве что нужно специально не взять последний элемент. Тогдf стоит использовать конструкцию arr[from:to][:-1].
Да, конструкция, наверное, хорошая. Ну вообще полно ситуаций, когда надо вычислить конец интервала, и он может получиться отрицательным. Самая банальная - раздуть интервал слева и справа на константу. Пишешь seq[from - flank:to + flank] и мигом получаешь что-нибудь отвратительное типа seq[-10:100510].
Это не работает на другом конце, там нужно знать длину. И это все равно костыль. Ну это же мрак, что всякий раз, когда есть сомнения в знаке, есть шанс улететь черт те куда и даже не узнать об этом, типичный си. Уж на что я не любил матлаб, но написать три буквы для индексации с конца для мне никогда не было проблемой.
Ну и какие-такие функции? Половина кода в последнее время у меня - это скрипты, заинлайненные в баш-команду. :)
Разумеется. Но это не повод делать косячный механизм, когда можно сделать почти столь же удобную альтернативу, не имеющую идиотского побочного эффекта.
// Это может сделать несолько более сложным переопределение оператора индексации.
В dlang это (там это называется не end, а $) считается хитрым синтаксисом для унарной операции "длина массива", которую можно переопределить (её, а не оператор индексации). На самом деле чуть хитрее: второй compile-time аргумент "номер индекса" (если у вас двумерный массив, и по каждой координате свой end), но в целом вроде так. Подробностей не знаю, сам недавно в документации прочитал. :-)
(тут была ссылка на документацию, но ЖЖ все посторонние ссылки считает спамом! убивать!)
Занятно... Оператор, который обретает смысл только внутри квадратных скобок. Но все-таки удобнее, чтобы $ был самостоятельным объектом. Тогда его можно будет записать в переменную и использовать в индексации её. Кстати, только сейчас узнал, что в питоне слайсы в переменную все таки можно записать. Из синтаксиса неочевидно.
Comments 13
Reply
Reply
Reply
- гибкое переопроеделение оператоов
- возможность указать, какие методы не меняют объект (и какие объекты не будут изменяться в функции)
- система шаблонов, не затирающая типы при компиляции (на джаве от этого страдаю).
Это, конечно, не отменяет того, что в c++ много ужасов. Впрочем, я провел с ними достаточно много времени, чтобы меня эти проблемы не слишком напрягали. Только IO по-настоящему бесит.
Reply
Тогдf стоит использовать конструкцию arr[from:to][:-1].
Reply
Ну вообще полно ситуаций, когда надо вычислить конец интервала, и он может получиться отрицательным. Самая банальная - раздуть интервал слева и справа на константу. Пишешь seq[from - flank:to + flank] и мигом получаешь что-нибудь отвратительное типа seq[-10:100510].
Reply
Reply
Ну это же мрак, что всякий раз, когда есть сомнения в знаке, есть шанс улететь черт те куда и даже не узнать об этом, типичный си. Уж на что я не любил матлаб, но написать три буквы для индексации с конца для мне никогда не было проблемой.
Ну и какие-такие функции? Половина кода в последнее время у меня - это скрипты, заинлайненные в баш-команду. :)
Reply
Reply
Reply
В dlang это (там это называется не end, а $) считается хитрым синтаксисом для унарной операции "длина массива", которую можно переопределить (её, а не оператор индексации). На самом деле чуть хитрее: второй compile-time аргумент "номер индекса" (если у вас двумерный массив, и по каждой координате свой end), но в целом вроде так. Подробностей не знаю, сам недавно в документации прочитал. :-)
(тут была ссылка на документацию, но ЖЖ все посторонние ссылки считает спамом! убивать!)
... Художественная самодеятельность ...
Reply
Кстати, только сейчас узнал, что в питоне слайсы в переменную все таки можно записать. Из синтаксиса неочевидно.
Reply
Leave a comment