LINUX.ORG.RU

История изменений

Исправление 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, либо ты принципиально не понимаешь, как работает такая система типов.