Vladimir
Box<u64> в твоем случае
Маjко
Vladimir
Чтоб конкретный тип боксить
Vladimir
Например какой-то не обжект сейф типаж
Маjко
fn test() -> impl Hash {
10u64
}
Маjко
Hash тоже не Object Safe
Маjко
его нельзя сделать трейтобъектом
Vladimir
Ну у него ж в оригинале был бокс
Anonymous
Box<Φ> и Box<impl Φ> не эквивалентны?
Маjко
С имплом он не нужен
Max
(это были мои счетные попытки сделать это не в ночнушке)
Vladimir
Та там не было трейтобьект
Маjко
Vladimir
Anonymous
ого почему
Vladimir
Потому что ф это инпат параметр
Vladimir
А имл ф аутпат
Anonymous
хмммм?
Vladimir
Или ты про хеш?
Vladimir
Box<Hash> и Box<impl Hash>?
Маjко
Vladimir
Или Box<F:Hash>
Vladimir
Короче третье требует инпат параметр. Второе возвращает конкретный тип реализующий типаж. Первое трейтобьект
Vladimir
Anonymous
Или ты про хеш?
fn φ0() -> Box<Any> { box 1 }
fn φ1() -> Box<impl Any> { box 1 }
Vladimir
Не буду ж я писать fn foo<H:Has>()
Anonymous
равны ли эти функции?
Anonymous
по своему поведению
Vladimir
Vladimir
не уверен что по поведению они как-то будут отличаться
Vladimir
хотя нет, отличить их можно
fn test3<B:Sized>(_: Box<B>) {}
fn test1() -> Box<impl Any> {
Box::new(10u64)
}
fn test2() -> Box<Any> {
Box::new(10u64)
}
Vladimir
fn main() {
test3(test1());
test3(test2());
}
Vladimir
второе компилиться не будет
Anonymous
ооо
Anonymous
понял
Anonymous
typeid типа с impl Trait нельзя получить?
Vladimir
нету такого тайпайди
Vladimir
у него будет тайпайди u64
Vladimir
или того конкретного типа что под импл
Anonymous
🤔
Anonymous
так
Anonymous
сейчас
Vladimir
импл говорит, что я хочу вернуть что-то реализующее типаж, но я слишком ленив/компилятор слишком туп чтобы писать конкретный тип
Anonymous
https://play.rust-lang.org/?gist=ade9b198916ee6e8d90d37fd2dd03d38&version=nightly
Anonymous
и правда
Vladimir
ну у тебя и извращения
Vladimir
fn main() {
test3(test1());
test3(test2());
println!("typeid u64 = {:?}", TypeId::of::<u64>());
}
fn test3<B: ?Sized + 'static>(_: Box<B>) {
println!("typeid = {:?}", TypeId::of::<B>());
}
выводит
typeid = TypeId { t: 11388137604015455702 }
typeid = TypeId { t: 10958581368050327586 }
typeid u64 = TypeId { t: 11388137604015455702 }
Anonymous
слишком сложно
Vladimir
так проще же
Vladimir
видно что у Any как трейтобъекта тип другой нежели у impl Any
Vladimir
а у Impl Any такой же как у u64
Anonymous
не нравится такой подход
Vladimir
а если например сделать так,
fn test1() -> Box<impl Any + ?Sized + 'static> {
Box::new(10u64) as Box<Any>
}
fn test2() -> Box<Any> {
Box::new(10u64)
}
Vladimir
то видно что у них теперрь одинаковый трейтобъект под капотом
Anonymous
эт логично
A64m
т.е. к трейту можно кастить? Я слышал, что трейты это вроде тайпклассов, т.е. я, конечно, ожидал поэтому что нельзя.
Маjко
Можно кастить к ссылке (боксу) на трейт, а не к трейту
A64m
а, ну да, тогда все правильно в рамках интуиции, что трейты - это тайпклассы
A64m
но тут какая-то магия получается с Box. я так понимаю что Box<impl Any> это аналог Any a => Box a где data Box a where New :: a -> Box a а Box<Any> это Box Any где data Box c where New :: c => a -> Box c
Vladimir
Забаньте кто-то его за хаскель в чате
Ignat
а что, в этом чяте только императивнобляди сидят?
Vladimir
Ты работу нашел? Хаскель воин
Ignat
попробуйте потоньше
Kerrigan
Kerrigan
а ты у нас только бинарногендерный?
Ignat
ну я бы понял, если бы там что-то сильно хаскелеспецифичное, а тут просто объявления типов данных
Ignat
такой резкий хейт — это странно
Kerrigan
правильный ответ был бы "уже иду на ICO"
Kerrigan
а ты сразу бомбишь
Kerrigan
не понимаю, rustler только для эликсира штоле
кана
Тонко
Ignat
разница в том, что в го убогая система типов — дизайн-решение, которое адепты считают фичей, а руст претендует на то, чтобы, будучи столь же эффективным в рантайме, как кресты, иметь адекватную 2017 году систему типов
A64m
ну, для тощего рантайма, она вполне адекватная
Ignat
я не имею ничего против системы типов раста
Ignat
ну или почти ничего