Size: a a a

Язык программирования Julia / Julia programming language

2020 May 25

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
По этому поводу был кстати интересный диалог в zulip недавно, да и в моей практике встречалось. Не всегда нужен полноценный абстрактный класс со всеми интерфейсами прописанными.

Условно, если нужно только length и get_index, то вполне можно этим и ограничиться и не думать о том, что полная версия массива должна быть намного больше/сложнее. Разумеется всё задачей определяется.

У меня в своё время это было, когда я со строками работал. Закончилось просто тем, что я сделал тип что-то вроде

struct MyString <: AbstractString
 data::String
 l::Int
end

Base.::length(x::MyString) = x.l


Я упрощаю конечно, но суть была именно такая. Половина методов строк не работала, но в той конкретной задаче этого и не было нужно.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Разумеется, это была внутренняя структура и наружу не экспортировалась, во избежание недоразумений.
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Там проблема в том, что copyto! копирует наследников AbstractArray поэлементно идя по индексу и не используя итератор, даже если он определен.
Как-то вот так:
@inbounds for i in srcinds
       dest[i] = src[i]
   end
источник

A

Alexandr in Язык программирования Julia / Julia programming language
И даже если ты определил полный интерфейс для своего массива, но у тебя медленный случайный доступ (например ты данные с диска последовательно поднимаешь) то не смотря на полный интерфейс массива идея формально указать что ты наследник AbstractArray так себе....
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
А почему нельзя переопределить copyto для своего типа массива, чтобы он уважал итератор?
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Можно. Но я не уверен, что нужно переопределить только copyto! В принципе если бы в документацию вынесли все методы, которые нужны для нормального фунционирования AbstractArray вне зависимости от его внутренней архитектуры (он может быть например list по реализации), то уже это решило бы проблему. А так нужно методом тыка искать где еще в ядре решили что итератор использовать необязательно
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
Есть еще куча методов для AbstractVector, которые тупо не добавили в StructArray
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Да это может и не проблема, но опять таки если у них есть реализация по умолчанию и она работает ожидаемым образом.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Хм, я тут подумал, а как в принципе должна copyto работать с итераторами? С правой частью всё понятно, а вот что делать с левой?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
for x in src
 dest[?] = x
end
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
То есть либо в какой-нибудь enumerate оборачивать и тогда копия будет в потенциально другом порядке писаться, либо итератор должен возвращать значение и индекс.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Но это явно очень узкий класс массив, который будет уметь так делать.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
В Julia это стандартно внешним пакетом решается, в Base такого точно не будет.
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Вот ведь... А ведь правда.  Как-то так незаметно договорились до того что вообще итераторы в Джулии странно устроены. 🙂 Видимо дейсвительно нужно для кастомных массивов переопределять copyto!
источник

A

Alexandr in Язык программирования Julia / Julia programming language
В stl в плюсах итераторы хорошо устроены. В плане позволяют отделить алгоритмы от внутреннего устройства массивов.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
А как это бы выглядело в рамках текущей задачи?
источник

A

Alexandr in Язык программирования Julia / Julia programming language
В смысле как бы в плюсах выглядело?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Эх....
Я уже забыл как плюсы выглядят 😊

Как бы оно выглядело в Джулии, если бы в ней итераторы были как в stl в плюсах.

Я понимаю, что задачка так себе 😊)) Но если это возможно написать, то было бы интересно посмотреть. На условном псевдокоде.
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Ну что-нибудь типа такого
for a in src
    set!(dest_it, a)
    next!(dest_it)
end

Ну т.е. предполагается что итератор хранит состояние и указатель на текущий элемент. На плюсах это выглядит примерно так
for(auto src_it = src.begin(); src_it < src.end(); ++src_it) {
*dest_it = *src_it;
++dest_it;
}
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
источник