Anonymous
^^
впихнуть можно, но не впихивает ведь
Anonymous
а выдает участника i32
big
а где нельзя?
big
потому что early return происходит! )
big
иными словами fn a() → i32 { return 1 ! }
Filipp
результат вычисления выражения с типом ! невозможно получить. в случае с ретюрном - аргумент копируется на фрейм выше, в случае с брейком - выносится из скопа цикла
big
во!
big
! это как enum Void { }
big
его значение нельзя материализировать, и именно поэтому его можно пихать куда угодно
Filipp
https://stackoverflow.com/questions/31082098/why-would-i-use-divergent-functions
big
т.е. таким финтом можно заявлть что управление туда никогда не дойдет
Loyd
Ну, если лаконичнее, то речь о hask категории
Anonymous
рили троллят
Filipp
рили троллят
ага прямо в офф доке троллят. нигде от них не спрятаться https://doc.rust-lang.org/book/first-edition/functions.html#diverging-functions
big
ну вот кстати у раста проблемы небольшие с этим типом
big
он пока не настоящий
big
https://play.rust-lang.org/?gist=b16e476f7f2ed4262fc5dcf68058f864&version=stable
big
Я ожидал что-нибудь вроде ! has no fn foo
Anonymous
Anonymous
вот о чем я говорю
big
ну так это не правильно )
Anonymous
что не правильно?
Anonymous
ты мне говоришь что ретурн имеет тип !
big
return x; x же должен быть выражением который соответсвует возвраащемому типу
Anonymous
ты мне говоришь что ретурн имеет тип !
но я пытаюсь выдать его и он не тайпчекается как !
big
так ошибка то в другом месте )
big
тогда ты должен писать return ! чтобы тайпчекнулось
Anonymous
что за return !
Anonymous
можно
Filipp
его нельзя инстанциировать как ты его выдашь?
Anonymous
fn a() -> ! { panic!() }
big
что за return !
тебе нужно заменить ! выражением которое возвращает ! )
Anonymous
так у нас тогда инхеритится тип внутри return
Filipp
fn a() -> ! { panic!() }
он не инстанциируется здесь, у тебя просто управление передается
Anonymous
это и есть создание !
big
не-а
big
ты не можешь создать !, в этом и прикол всех этих фокусов
big
panic! не возвращает управления, а следственно не может ничего создавать и возвращать
big
всмысле может, но только в типах. По факту никакого значения не возвращается
Filipp
https://www.reddit.com/r/rust/comments/3j22vx/what_is_the_meaning_of_as_a_return_type/ The return type " -> ! " implies that this function never returns.
Filipp
это и есть создание !
ты по-моему сам троллишь
Anonymous
так
Anonymous
fn a() -> i32 { (return 1): ! } работает
Anonymous
странно что оно не документировано 🤔
Anonymous
ты не можешь создать !, в этом и прикол всех этих фокусов
какой смысл во включении ! в каждый тип тогда?
Filipp
потому что ты можешь не создать что угодно
Filipp
где тут противоречие?
Filipp
https://doc.rust-lang.org/book/second-edition/ch19-04-advanced-types.html#the-never-type--that-never-returns
Anonymous
fn a() -> i32 { (return 1): ! } работает
хотя нет даже это не гарантирует что return это !
big
вот кстати пример полезный Ты можешь реализовать Result<T, !>. Таким образом ты можешь гарантировать что у тебя никогда не может быть вощвращен Err (потому что при создании этого варианта тебе придется предоставить значение типа !. Спойлер: ты не можешь этого сделать) Таким образом ты получаешь замечательное свойство, что result.unwrap_err() возвращает !. Т.е. никогда не возвращает значение и может быть заменено просто panic!() )
Anonymous
я не просил учить меня пустым сетам
big
ого, ну раз ты в теме, то тогда точно тролиш
big
раскрыл сам себя
big
друзья, есть какой-то способ, чтобы при компиляции rustc кормил линкер не своими *.rlib'ами, а нормальными человеческими *.O'шками с биткодом?
big
(и чтобы без приколов вроде *.bytecode.encoded)
պլհկ
Какую проблему ты решаешь?
big
ебусь с эмскриптеном
big
он пытается считать все что находится в *.rlib'е и давиться этим
Vladimir
Либы это не ошки а .а в лучшем случае
big
насколько я понимю, *.rlib это такой *.a архив, а внутри него *.o
Vladimir
Объектники вроде нельзя в расте, но если можно dylib то наверное и Статик можно
big
я знаю что если очень захочится, то можно линковать и при помощи GCC. Я так полагаю что там без обьектников не обойтись ведь
big
но это мне все не важно. Мне конкретно очень хочеться что бы rustc взял и накормил линкер своими *.o файлами с LLVM BC.
big
и не пытался накормить emcc своими *.bytecode.encoded и уж тем более rust.metadata.bin
big
как это не LLVM
big
так блед
Vladimir
Может тебе ir эмитить
big
$ file target/main.main0.rust-cgu.o target/main.main0.rust-cgu.o: LLVM IR bitcode
big
Может тебе ir эмитить
да, вообщем то думаю рано или поздно к этому сведется. Буду собирать сам )
Vladimir
Как ты это собрал
Vladimir
Ошники это точно не ллвм байткод
big
ну ребята, понятное дело. Но в мире Rust+LLVM (в clang не замечал такого, но не удивлюсь) такое бывает
Vladimir
Скорее всего проще чем из ir в байткод - не будет
big
да уж, не хотелось бы далеко отходить от cargo build и кастомить оч сильно линкер. но мб придется
Vladimir
Проверь --emit-llvm
Vladimir
Без ir
big
--emit llvm-bc ты имеешь ввиду?
Vladimir
Или так
big
да, так то оно вообщем то работает