Αλεχ
которые проверят правильность аргументов
Cat
ну в питоне так же
Sergey
Cat
только проблему корректности логики это не решает
Cat
это уже контракты какие-то
но по-прежнему не логика
Αλεχ
так тип это и есть конртакт
Αλεχ
ну у тебя есть два варианта
Αλεχ
использовать просто число и проверять, что корректно работает этот случай
Αλεχ
использовать подходящий тип и не писать никаких тестов
Sergey
Αλεχ
fn div(a: u32, b: u32) -> u32
Cat
я имел в виду контракты как в немодных нынче языках, а-ля пред- и пост-условная верификация
Αλεχ
fn foo(a: uint) -> Result<(), ()>{
if a > 10 && a.is_prime() { Ok (()) } else { Err(()) }
}
Αλεχ
и писать тесты, что в одном случае ok, а в другом - err
Cat
Денис
Денис
но ведь всё скомпилировалось
Денис
как так?
Αλεχ
или
fn foo(a: PrimeNumberBiggerThan10) {
}
Cat
а что такое PrimeNumberBiggerThan10?
Sergey
Αλεχ
ну в одном случае мы юзаем u32
Αλεχ
а в другом PrimeNumberBiggerThan10
Αλεχ
и то и то типы
Sergey
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
Αλεχ
как это не тип?
Sergey
вот так
Αλεχ
написано struct, значит тип
Αλεχ
компилятор с тобой не согласен
Αλεχ
я могу написать foo<T: PrimeNumberBiggerThan10>
Αλεχ
спека говорит что в таком контексте можно использовать только тип или лайтфайм
Αλεχ
раз компилится значит это тип или лайфтайм
Αλεχ
Sergey
Sergey
компилятор не может проверить эту логику
Sergey
суть тестов
Sergey
проверить ту логику, которую компилятор не может
Cat
Αλεχ
ну так о том и речь
Αλεχ
Αλεχ
в шарпик должны завести скоро бтв
Αλεχ
Sergey
можешь
Αλεχ
и это будет тип не хуже u32 какого-нибудь
Αλεχ
и тебе не придется писать тесты в тех местах, где тебе нужно целое число
Sergey
Денис
@Psilon из-за твоих упоротых вбросов кто-то ушёл из канала
Денис
тебе не стыдно?
Αλεχ
Αλεχ
тебе показалось
Денис
уже 665
Sergey
Αλεχ
ну и так до общей степени упоротости
Αλεχ
я надеюсь лет через 10 компилятор научится это выводить по типу impl Trait
Sergey
а на foo(50) и foo(2)
не показал
Αλεχ
Αλεχ
ты прав
Денис
Sergey
Денис
а 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
Evgεny
Подскажите, как фучу нынче выполнить? Тут теперь какой-то run и ничего он не возвращает, да и блочится
Cat