Форум программистов, компьютерный форум, киберфорум
Rust
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1

Что такое трейт

08.05.2025, 18:13. Показов 1715. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Посмотрел я видик про язык Rust. Сейчас про него много говорят. Трейты вот что там есть и это то чего не хватает Твин-бейсику (и любому др. языку). Трейт, это такая штука, если я правильно понял, которая позволяет добавить любому типу как бы дополнительный метод. По моему это что-то реальное.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2025, 18:13
Ответы с готовыми решениями:

Что такое "прелюдия" и что в ней изменилось?
В книге М. Липовачи для примера дана пользовательская реализация функции elem: elem'::(Eq...

Что-то не так с типами данных, не пойму что
помогите пожалуйста, база данных дает ввести тип, при том так со всеми данными, которые ввожу в бд...

Деревья, так или не так?
data BBaum a = BBlatt a | BKnoten (BBaum a) a (BBaum a) deriving(Eq,Show) BKnoten (BKnoten...

17
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
08.05.2025, 21:34
testuser2, ничего не понял
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
09.05.2025, 01:41  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
ничего не понял
Допустим, мы добавили типу String трейт ToAnsi и теперь у каждой строки появляется свойство ".ToAnsi". Или допустим всем массивам (в idl/odl это тип SAFEARRAY) мы добавили трейт IsInit и трейт Push.. Это какбы добавляет читаемости и в то же время сокращет код.

Добавлено через 2 минуты
Visual Basic
1
2
If Arr.IsInit Then 'сравнение
If isArrayInitisize(Arr) Then
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
09.05.2025, 02:19
Цитата Сообщение от testuser2 Посмотреть сообщение
Трейты
А что такое трейт? Я такого слова не знаю!
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
09.05.2025, 02:46  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
А что такое трейт?
Ну я вроде написал, "сказки про белого бычка" не люблю рассказывать )
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
09.05.2025, 18:40
testuser2, ничего не понял короче
1
Модератор
Эксперт Java
 Аватар для alecss131
2856 / 1363 / 407
Регистрация: 11.08.2017
Сообщений: 4,357
Записей в блоге: 2
10.05.2025, 15:50
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Цитата Сообщение от testuser2 Посмотреть сообщение
Трейты вот что там есть и это то чего не хватает Твин-бейсику (и любому др. языку). Трейт, это такая штука, если я правильно понял, которая позволяет добавить любому типу как бы дополнительный метод. По моему это что-то реальное.
Хм и что такого в этом? В других языках такое тоже есть. Вот пример на ржавчине
Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fn main(){
     
    let tom = Person{ name: String::from("Tom"), age: 36 };
    let tom_preview = tom.preview();
    println!("{}", tom_preview);
}
 
struct Person { name: String, age: u8}
 
trait Printer{
    fn preview(&self) -> String;
}
 
impl Printer for Person{
 
    fn preview(&self) -> String{
        format!("[Предпросмотр] Person {}; age: {}", self.name, self.age)
    }
}
И то же самое, но на свифте
Swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let tom = Person(name: "Tom", age: 36)
let tom_preview = tom.preview()
print(tom_preview)
 
struct Person{
    var name: String
    var age: UInt8
}
 
protocol Printer{
    func preview() -> String
}
 
extension Person: Printer{
    func preview() -> String{
        "[Предпросмотр] Person \(name); age: \(age)"
    }
}
но для добавления функционала можно обойтись и без протокола
Swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
let tom = Person(name: "Tom", age: 36)
let tom_preview = tom.preview()
print(tom_preview)
 
struct Person{
    var name: String
    var age: UInt8
}
 
extension Person{
    func preview() -> String{
        "[Предпросмотр] Person \(name); age: \(age)"
    }
}
Цитата Сообщение от HackerVlad Посмотреть сообщение
А что такое трейт? Я такого слова не знаю!
Очень похоже на интерфейсы в других языках или как в моем примере протокол. Только тут авторы языка решили извратиться и назвать не пойми как. Единственное отличие от того же интерфейса в тех же джава/шарп, что их нельзя прикрутить к уже готовому классу не меняя его определение, тогда как в свифте такое можно провернуть через расширение. Эти интерфейсы можно возвращать и получать из функций.
2
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
10.05.2025, 18:39  [ТС]
alecss131, спасибо за наглядные примеры, да, действительно, трейты это такж как протокол и расширения в Свифте. Свифт силен, да. Мне также понравилось как многое выглядит в Расте. Там всюду краткие названия, в это тоже есть определеный прикольчик. Понятное слово &self и здесь тоже все понятно
Цитата Сообщение от alecss131 Посмотреть сообщение
impl Printer for Person{
имплементируем Printer для Person
В, принцпие, наверное, эти скобочки "{}", в этом тоже, что-то есть, то что не мешается тект и переменные в одну кучу..

Добавлено через 9 минут
В свифте эта строка выглядит лучше, в расте какое-то нагромождение name: String::from("Tom")
Цитата Сообщение от alecss131 Посмотреть сообщение
let tom = Person(name: "Tom", age: 36)
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
10.05.2025, 19:14
Цитата Сообщение от alecss131 Посмотреть сообщение
но для добавления функционала можно обойтись и без протокола
Как и на Rust
Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fn main(){
     
    let tom = Person{ name: String::from("Tom"), age: 36 };
    let tom_preview = tom.preview();
    println!("{}", tom_preview);
}
 
struct Person { name: String, age: u8}
 
impl Person{
 
    fn preview(&self) -> String{
        format!("[Предпросмотр] Person {}; age: {}", self.name, self.age)
    }
}
Небесполезно глянуть в Вику.
А ещё, в Haskell они же называются классы типов.
1
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
10.05.2025, 19:33  [ТС]
Из приведенных примеров виден такой плюс Раста, что он как бы все проговаривает, допустим здесь он говорит, что функция в расширении принимает аргумент &self, невидимый. Наверное можно и не передавать этот аргумент и наверное последующие аргументы уже должны быть видимые.. это, конечно уже другой вопрос.
Цитата Сообщение от Curry Посмотреть сообщение
Rust
1
fn preview(&self) -> String{
Здесь проговаривание, что строка получена таким-то способом
Rust
1
String::from("Tom")
0
Модератор
Эксперт Java
 Аватар для alecss131
2856 / 1363 / 407
Регистрация: 11.08.2017
Сообщений: 4,357
Записей в блоге: 2
11.05.2025, 11:52
Только вот я бы сказал что использование подобного расширения плохая практика, так как сущность может определяться в одном месте, а расширяться совсем в другом, что очень сильно усложняет понимание кода.
Все же главное использование протоколов в свифте такое
Swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let tom = Person(name: "Tom", age: 36)
let tom_preview = tom.preview()
print(tom_preview)
 
struct Person: Printer{
    var name: String
    var age: UInt8
 
    func preview() -> String{
        "[Предпросмотр] Person \(name); age: \(age)"
    }
}
 
protocol Printer{
    func preview() -> String
}
то есть взятие на себя обязательств на реализацию требований протокола, причем требования не только к функциям, но и свойствам.
Не знаю можно ли так делать в ржавчине, с языком не знаком.
И разумеется это для передачи и получения определенных типов из функций. То есть прямой функционал интерфейсов. Например в функцию вида func show(printer: Printer) подойдет и такое определение struct Person: Printer и такое расширение extension Person: Printer
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
11.05.2025, 14:10  [ТС]
Вот я как вижу со своей примитивной точки зрения, что берешь, допустим вводишь переменную любого типа, сложного/простого, нажимаешь (так и хочется сказать это слово) вводишь точку и видишь разные ручки у этого объекта или субъекта. Ручки, рычажки, кнопочки.. он сам как-бы подсказывает что можно с ним делать и автоввод еще упрощает это все дело. И я даже говорою не в пользу конкретно раста, которого побаиваюсь, также как и любых подобных ЯП-ов в которых скрыт какой-то огромный, возможно очень не понятный мир. Но, то что есть возможность добавлять свои рычажки, которые не берут особой платы за ресурсы, по мне это выглядит довольно не плохо.

Добавлено через 7 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
вводишь точку и видишь разные ручки у этого объекта или субъекта
Продолжая эту мысль.. ты можешь что-то забыть в огромном потоке информации, но нажимаешь точку и вот тебе напоминалка, это реляционная связка в большой базе данных, которую ты сам можешь дополнять и улучшать т.ск...
0
Невнимательный
 Аватар для ft4l
3108 / 1285 / 358
Регистрация: 08.02.2013
Сообщений: 7,546
Записей в блоге: 2
11.05.2025, 14:43
Цитата Сообщение от testuser2 Посмотреть сообщение
Трейт, это такая штука, если я правильно понял, которая позволяет добавить любому типу как бы дополнительный метод.
или кучу всего )
В нормальных языках, типа php,)) это такая штука, которая позволяет расширять классы не только наследованием,
но и со стороны тянуть трейты... точно так же, переопределяя или нет методы ... если они не абстрактные.

Не знаю как в Rust, но если верить докам php, то похоже и там это тоже просто способ юзать множественное наследование
Трейт - это механизм обеспечения повторного использования кода в языках с поддержкой только одиночного наследования, таких как PHP.
по сути почти ничем не отличается от варианта с родительским классом,
кроме того что одно как-бы вертикальные расширения,
а второе горизонтальные
+ возможность переопределение трейтом того что в родительском
+возможность разрешения конфликтов имён
... Такие нюансы наверное надо почаще смотреть в доках... таких языков которые всё время чего-то пилят-перепиливают )
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
11.05.2025, 16:27  [ТС]
Цитата Сообщение от ft4l Посмотреть сообщение
или кучу всего )
В нормальных языках, типа php,)) это такая штука, которая позволяет расширять классы не только наследованием,
но и со стороны тянуть трейты... точно так же, переопределяя или нет методы ... если они не абстрактные.
Не знаю, как переопределять или что-то мутировать динмически на ходу, это кажись, не очень тема, чреватая путаницами, а вот что-то додолнять, притом статически прописанными протоколами, трейтами или чем-либо еще, это немножко наверно другое, и главное не путать возмжоности принципа, со злоупотреблением этим принципом.
0
46 / 38 / 10
Регистрация: 25.02.2025
Сообщений: 84
11.05.2025, 16:45
Лучший ответ Сообщение было отмечено testuser2 как решение

Решение

>Не знаю, как переопределять или что-то мутировать, это кажись, не очень тема, чреватая путаницами, а вот что-то додолнять, притом статически прописанными протоколами, трейтами или чем-либо еще, это немножко наверно другое, и главное не путать возмжоности принципа, со злоупотреблением этим принципом.

Да, вцелом вы рассуждаете в русле современных тенденций в программировании. Сейчас идёт отход от расширения типов в пользу возможности определения своих методов, связанных с типом, в любом месте программы. Так можно делать в Ruste и в Delphi / Free Pascal.

Добавлено через 9 минут
Rust - язык очень хитрый. Он отказывается от технологий объектно-ориентированного программирования (в нём нет расширения типов, полиморфизма, а инкапсуляция производится другим способом) и использует другую технологию для программирования абстракций. Эта технология более простая, но в то же время более надёжная.

В Ruste нет таких проблем как в объектно-ориентированных языках как хрупкость базового класса, раздутость таблицы виртуальных методов при глубокой иерархии объектов, неоднозначность при множественном наследовании и других.
2
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
11.05.2025, 20:55
Цитата Сообщение от alecss131 Посмотреть сообщение
сущность может определяться в одном месте, а расширяться совсем в другом, что очень сильно усложняет понимание кода.
Это спорно, что усложняет. По крайней мере, мне так не кажется. В одних модулях/файлах расширили и использовали так, в других эдак. Напоминает разных потомков одного класса в ООП.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
13.05.2025, 13:53  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
ничего не понял короче
Теперь-то ты понимаешь, что то о чем я говорил, это очень хорошо и это современные тенденции программирования? ) Интересно будет посмотреть, как будет развиваться такой подход.
0
46 / 38 / 10
Регистрация: 25.02.2025
Сообщений: 84
13.05.2025, 16:53
При помощи трейтов можно, с одной стороны, реализовать в некоторой степени аспектно-ориентированное программирование, когда в класс внедряется дополнительная функциональность без изменения кода класса, с другой стороны можно реализовать наследование без расширения типов (наследование в силе mix-in, примеси).
Всё это из-за недостатков объектно-ориентированного программирования придумывают.
Про недостатки:
https://tproger.ru/translation... r-disaster
https://habr.com/ru/articles/885980/
https://habr.com/ru/companies/nmg/articles/737200/

Также при помощи трейтов по-другому реализуется инкапсуляция. Инкапсуляция - сокрытие внутренней структуры объекта. В объектно-ориентированном программировании сокрытие организуется при помощи спецификаторов доступа. Если ставите private - то извне нет доступа. Однако при таком подходе возникают определённые проблемы.
В Rustе трейт ничего не инкапсулирует, он только лишь определяет абстрактный тип и методы работы с этим типом.
Допустим мы хотим сделать очередь с двумя методами put (положить) и get (взять). Мы создаём модуль myqueue (то есть крейт) и в нём описываем трейт Очередь. Трейт общедоступен извне, а конкретная реализация очереди - недоступна.
Вот файл myqueue:

Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
pub trait Queue
{
    fn put( &self );
    fn get( &self );
}
 
struct QueueObj
{
}
 
impl Queue for QueueObj
{
    fn put( &self )
    {
        println!( "put called." );
    }
 
    fn get( &self )
    {
        println!( "get called." );
    }
}
 
pub fn new() -> std::rc::Rc< impl Queue >
{
    let q: QueueObj;
    
    q = QueueObj {};
    return std::rc::Rc::< QueueObj >::new( q );
}
struct QueueObj - реализация очереди, она недоступна извне модуля.
Функция new - доступна извне модуля, она создаёт объект очереди и возвращает его.

Вот использование очереди из другого модуля:

Rust
1
2
3
4
5
6
7
8
9
10
fn main() 
{
    let q: std::rc::Rc< dyn myqueue::Queue >;
    
    println!("Hello, world!");
    q = myqueue::new();
    q.put();
    q.get();
    
}
Добавлено через 7 минут
Rc - это интеллектуальный указатель (для автоматического освобождения памяти).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.05.2025, 16:53
Помогаю со студенческими работами здесь

Что я делаю не так или как запустить свою первую прогу на Perl?
Отсюда скачал IDE Perl, так её назову http://www.softportal.com/get-70-activeperl.html А вот...

Объединить два списка в один так, чтобы элементы второго списка, которые есть в первом, в новом списке не были
Prolog Добавлено через 1 минуту Умные люди, помогите пожалуйста!!!!!! Мне на прологе нужно...

Написать программу объединения двух списков в третий так, чтобы нечетные (по номеру) элементы были из первого вписка, а четные - из второго.
Написать программу объединения двух списков в третий так, чтобы нечетные (по номеру) элементы были...

Вывести текст так, чтобы в каждой строке на выходе было не более, чем W символов
Есть текст в строке, не содержащей символы перевода строки. Текст состоит из слов (будем считать за...

Удаление начала списка до заданного элемента (включительно) Что деаю н так?
Помогите пожалуста чтото неполучается у меня. В чём ошибка? nondeterm proc_2_2(list,list,string)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru