Маjко
Я конечно не лингвист
Маjко
Но чем метадата не дескриптор?
Vladimir
1) есть несколько буфферов, один на уровне ос другой на write/read у libc, и ещё есть bufwriter у раста.
2) когда делаешь close всё программные буферы флашатся, но нет гарантии флаша буфера ос.
3) fsync делает флеш буфера ос
4) ос должна уметь хендлить всю работу с файлами, и трекание буферов им соответствующих без fsync
պլհկ
при rename inode не меняется, привет
Денис
Berkus
Berkus
в любой нормальной ос связь между буферами в кеше и файлом на диске не теряется
Alexander
Денис
Денис
по крайней мере в нашем контексте
պլհկ
Я конечно не лингвист
есть четкое понятие “файловый дескриптор” (https://en.wikipedia.org/wiki/File_descriptor), не надо его обобщать
Alexander
ну это одно и то же по сути-то)
Ну что-то руками вызывать в расте лень, так как про файл сразу сказано - забейте, мы сами закроем когда надо, как бы забиваешь и обламывается.
պլհկ
Alexander
Это не особо проблема конечно, но если бы дать сразу после окончания использования, как я раньше писал, то и этой проблемы бы не было.
Oleg
жентельмены, а представим, что я хочу целочисленный 4 байтный тип не для битоёбства, а для целых чисел в диапазоне -(2^31 - 1) .. 2^31 - 1
положим, я назову его Shit
и так, чтобы Option<Shit> Тоже был четырёхбайтным например, а None представлялся как 1000..0
могу я это сделать в расте сегодняшнего дня или нет?
Денис
Маjко
Маjко
պլհկ
Денис
Vladimir
Oleg
Vladimir
Пока все оптимизации с option встроены в компилятор, но вроде хотели это расширить
Денис
https://stackoverflow.com/questions/7433057/is-rename-without-fsync-safe
Αλεχ
Αλεχ
Что мешает сделать тип Shit
Αλεχ
с методом is_none?
Маjко
Oleg
и чтобы все методы, которые принимают там Option<A> принимали его
Маjко
Конечно нет, как ты себе это представляешь?
Oleg
и чтобы я его мог в каких-нибудь там итератах вызывать
Маjко
Засунуть 2 разных типа нельзя в не-генерик ф-ю
Alexander
Покажи код уже
Дык даже лень пример писать и так ясно:
{ let f = File::create... }
fs::rename
Денис
блин, форматирование поехало, в общем https://www.kernel.org/doc/Documentation/filesystems/ext4.txt — "Many broken applications..."
Маjко
Маjко
Oleg
ну и чтобы я мог это во всяких итераторах возвращать там ну и т.п.
Vladimir
Маjко
Так не выйдет
Vladimir
Маjко
Ты можешь сделать для своего типа какой-нить дешевый Into<Option<T»
Vladimir
Ну и отлично
Маjко
Чтобы при общении с внешним API конвертить
Oleg
ну это же всё равно будут всякие доп вызовы и мелькающие 8 байт на стеке
Маjко
А сделать специализацию is_none для Option<i32> абсолютно точно нельзя.
Маjко
Oleg
ну я не предполагал Option<i32>
Маjко
Надо тестить и смотреть асм
Маjко
Oleg
хорошо, ясно, спасибо
Vladimir
պլհկ
պլհկ
что и обещали
Маjко
хорошо, ясно, спасибо
Ну прост ты сам говоришь: 8 байт для обычного опшнала
А хочешь запихнуть в 4 и передавать в те же ф-и, так не выйдет
Oleg
ну я имел в виду дженерики
Oleg
это ведь не совсем "те же" функции будут
Vladimir
Маjко
Option это всегда 4 байта тэг + sizeof(data)
Oleg
Sergey
Маjко
Поменять лейаут структуры генерик не может
Маjко
Это не шаблоны
Sergey
Маjко
Oleg
Маjко
Это не фича языка)
Oleg
как, покажи?
https://play.rust-lang.org/?gist=c375f8f6d9a6558c18b7e42d52c60edd&version=stable&mode=debug
Sergey
Vladimir
По этому вложенные енамы могут занимать всего пару байт
Sergey
разницы нет