История изменений
Исправление Siborgium, (текущая версия) :
Давай о примерах. Касательно «не влезет» аргумент так себе, там действительно приличная простыня. Затем,
Это значит, что даже если передать туда обычный инт, для которого ord есть, очевидно, оно не сработает.
Если в С++ ты в шаблонную функцию, использующую <
, подставишь int
, как ты сделал в том примере, то конечно она заработает. Если MyType
, то конечно она не заработает, ведь у MyType
не реализован оператор <
. Минус такого подхода заключается в следующем:
-
Необходимо знать, что лежит в потрохах этой функции, чтобы не получать неожиданные ошибки.
-
В общем случае ты не можешь гарантировать, что оператор
<
, даже если он реализован у конкретного типа, реализует отношение строгого порядка. Это может быть частичный порядок, может быть вообще что-то иное.
В Rust эти проблемы решаются следующим образом: ты требуешь от типа реализации необходимых трейтов. Пример с int
провалится не потому, что у int
не реализовано отношение строгого порядка, а потому, что сама функция некорректна. Прочитай сообщение об ошибке внимательнее, функция обобщенного аргумента &[T]
не может реализовать max
потому, что сферический T
в вакууме не реализует Ord
, а именно сферический T
в вакууме ты и получаешь на входе. Аналогично с Debug
: ты не можешь напечатать обобщенный аргумент типа T
потому, что T
не реализует Ord
. Даже если ты подашь на вход какой-то конкретный тип, который будет реализовывать используемый трейт, функция все равно будет некорректной, ее корректность не зависит от аргумента на входе. Использование функции не требует знания ее потрохов – ее сигнатура уже сообщает тебе все, что нужно.
Если ты сделаешь
struct MyType(i32);
fn max_value<T: Ord + Debug>(items: &[T]) {
println!("{:?}", items.iter().max());
}
fn main() {
max_value(&[MyType(1), MyType(2), MyType(3)]);
}
, то функция окажется корректной, а подстановка туда MyType
– нет, ведь MyType не реализует Ord. Такая версия уже будет работать с int
и любым другим элементом класса типов Ord и Debug.
Итого, либо ты не понял, о чем говорил RazrFalcon, либо ты принципиально не понимаешь, как работает такая система типов. Такой вот царь.
Исходная версия Siborgium, :
Давай о примерах. Касательно «не влезет» аргумент так себе, там действительно приличная простыня. Затем,
Это значит, что даже если передать туда обычный инт, для которого ord есть, очевидно, оно не сработает.
Если в С++ ты в шаблонную функцию, использующую <
, подставишь int
, как ты сделал в том примере, то конечно она заработает. Если MyType
, то конечно она не заработает, ведь у MyType
не реализован оператор <
. Минус такого подхода заключается в следующем:
-
Необходимо знать, что лежит в потрохах этой функции, чтобы не получать неожиданные ошибки.
-
В общем случае ты не можешь гарантировать, что оператор
<
, даже если он реализован у конкретного типа, реализует отношение строгого порядка. Это может быть частичный порядок, может быть вообще что-то иное.
В Rust эти проблемы решаются следующим образом: ты требуешь от типа реализации необходимых трейтов. Пример с int
провалится не потому, что у int
не реализовано отношение строгого порядка, а потому, что сама функция некорректна. Прочитай сообщение об ошибке внимательнее, функция обобщенного аргумента &[T]
не может реализовать max
потому, что сферический T
в вакууме не реализует Ord
, а именно сферический T
в вакууме ты и получаешь на входе. Аналогично с Debug
: ты не можешь напечатать обобщенный аргумент типа T
потому, что T
не реализует Ord
. Даже если ты подашь на вход какой-то конкретный тип, который будет реализовывать используемый трейт, функция все равно будет некорректной, ее корректность не зависит от аргумента на входе. Использование функции не требует знания ее потрохов – ее сигнатура уже сообщает тебе все, что нужно.
Если ты сделаешь
struct MyType(i32);
fn max_value<T: Ord + Debug>(items: &[T]) {
println!("{:?}", items.iter().max());
}
fn main() {
max_value(&[MyType(1), MyType(2), MyType(3)]);
}
, то функция окажется корректной, а подстановка туда MyType
– нет, ведь MyType не реализует Ord. Такая версия уже будет работать с int
и любым другим элементом класса типов Ord и Debug.
Итого, либо ты не понял, о чем говорил RazrFalcon, либо ты принципиально не понимаешь, как работает такая система типов.