Αλεχ
которые проверят правильность аргументов
Cat
ну в питоне так же
Cat
только проблему корректности логики это не решает
Αλεχ
ну эм типы не проверят логику работы метода
ну например "простое число больше десяти" может быть типом
Cat
это уже контракты какие-то но по-прежнему не логика
Αλεχ
так тип это и есть конртакт
Αλεχ
ну у тебя есть два варианта
Αλεχ
использовать просто число и проверять, что корректно работает этот случай
Αλεχ
использовать подходящий тип и не писать никаких тестов
Αλεχ
fn div(a: u32, b: u32) -> u32
Cat
fn div(a: u32, b: u32) -> u32
здесь нет про "больше 10"
Sergey
использовать подходящий тип и не писать никаких тестов
опиши мне тип, который скажет, что для активного юзера, нужно инкрементировать счетчик, а для не активного не надо
Cat
я имел в виду контракты как в немодных нынче языках, а-ля пред- и пост-условная верификация
Αλεχ
fn foo(a: uint) -> Result<(), ()>{ if a > 10 && a.is_prime() { Ok (()) } else { Err(()) } }
Αλεχ
и писать тесты, что в одном случае ok, а в другом - err
Денис
fn foo(a: uint) -> Result<(), ()>{ if a > 10 && a.is_prime() { Ok (()) } else { Err(()) } }
а вдруг ты опечатался и написал там "11" вместо десяти?
Денис
но ведь всё скомпилировалось
Денис
как так?
Αλεχ
или fn foo(a: PrimeNumberBiggerThan10) { }
Cat
а что такое PrimeNumberBiggerThan10?
Αλεχ
ну в одном случае мы юзаем u32
Αλεχ
а в другом PrimeNumberBiggerThan10
Αλεχ
и то и то типы
Sergey
а в другом PrimeNumberBiggerThan10
опиши на расте его
Sergey
в расте так-то зависимых типов нет
Evgεny
D E P E N D E N T T Y P E S
Αλεχ
опиши на расте его
struct PrimeNumberBiggerThan10(u32); impl PrimeNumberBiggerThan10 { pub fn new(value: u32) -> Result<Self, ()> { if a > 10 && a.is_prime() { Ok ((Self(value))) } else { Err(()) } } }
Αλεχ
как это не тип?
Sergey
вот так
Αλεχ
написано struct, значит тип
Αλεχ
компилятор с тобой не согласен
Αλεχ
я могу написать foo<T: PrimeNumberBiggerThan10>
Αλεχ
спека говорит что в таком контексте можно использовать только тип или лайтфайм
Sergey
написано struct, значит тип
struct PrimeNumberBiggerThan10(u32); где здесь информация о том, что для 10 должна одна логика?
Αλεχ
раз компилится значит это тип или лайфтайм
Αλεχ
struct PrimeNumberBiggerThan10(u32); где здесь информация о том, что для 10 должна одна логика?
смысл в том же, зачем использовать разные типы вместо одного Any
Sergey
компилятор не может проверить эту логику
Sergey
суть тестов
Sergey
проверить ту логику, которую компилятор не может
Cat
> require > ensure
Αλεχ
ну так о том и речь
Αλεχ
> require > ensure
ага, мы в курсе
Αλεχ
в шарпик должны завести скоро бтв
Cat
ага, мы в курсе
тогда не буду держать в курсе
Sergey
ну так о том и речь
в расте нет возможности описать ТИП зависимый от значения
Αλεχ
в расте нет возможности описать ТИП зависимый от значения
ты всегда можешь завести тип ЦЕЛОЕ ЧИСЛО
Sergey
можешь
Αλεχ
и это будет тип не хуже u32 какого-нибудь
Sergey
ты всегда можешь завести тип ЦЕЛОЕ ЧИСЛО
но этот тип не зависит от значения указать ты не можешь
Αλεχ
и тебе не придется писать тесты в тех местах, где тебе нужно целое число
Sergey
Денис
@Psilon из-за твоих упоротых вбросов кто-то ушёл из канала
Денис
тебе не стыдно?
Αλεχ
Αλεχ
тебе показалось
Денис
уже 665
Αλεχ
но придется везде, где мне нужно число от 0 до 50
ну а там заводишь тип "число от 0 до 50"
Αλεχ
ну и так до общей степени упоротости
Αλεχ
я надеюсь лет через 10 компилятор научится это выводить по типу impl Trait
Sergey
ну а там заводишь тип "число от 0 до 50"
покажи мне функцию, чтобы компилятор при ее использовании показал мне ошибку foo(51)
Sergey
а на foo(50) и foo(2) не показал
Αλεχ
ты прав
分解物質
а на foo(50) и foo(2) не показал
в c++ с constexpr такое возможно 👀
Sergey
в c++ с constexpr такое возможно 👀
интересно было бы глянуть
Денис
а constexpr аргументы только внутрь constexpr функций загружаются с сохранением логики повествования
Денис
можно сделать template<int N> void foo() { static_assert(N == 50, "N should be 50"); } но int i = 50; foo<i>(); уже не сделаешь
Денис
constexpr int n = 50; правда можно сделать, но делу это не поможет
Marat
https://twitter.com/gamecriticbot/status/1003247822068645889
Roma
https://twitter.com/gamecriticbot/status/1003247822068645889
https://en.wikipedia.org/wiki/Rust_(video_game)
Evgεny
Подскажите, как фучу нынче выполнить? Тут теперь какой-то run и ничего он не возвращает, да и блочится