Rust — ключевые слова Super и Self
Опубликовано: 10 Января, 2023
Rust — это язык программирования с несколькими парадигмами, подобный синтаксису C++, который был разработан для повышения производительности и безопасности, особенно для безопасного параллелизма за счет использования средства проверки заимствования и владения для проверки ссылок. Ключевые слова self и super, предоставляемые Rust, можно использовать в пути для устранения двусмысленности при доступе к таким элементам, как функции.
Пример:
Rust
// Rust program for Super & Self Keywords fn function_with_same_name() { println!("called `function_with_same_name()` which is in the outermost scope"); } mod cool_mod { pub fn function_with_same_name() { println!("called `cool_mod::function_with_same_name()` which is inside the `cool_mod` module in the outermost scope"); } } mod my_mod { fn function_with_same_name() { println!("called `my_mod::function_with_same_name()` which is inside the `my_mod` module"); } mod cool_mod { pub fn function_with_same_name() { println!("called `my_mod::cool_mod:: function_with_same_name()` which is inside the `cool_mod` module which is in turn inside `my_mod` module"); } } pub fn indirect_call() { // Let"s access all the functions named //`function_with_same_name` from this scope! print!( "called `my_mod::indirect_call()`, that
> " ); // The `self` keyword refers to the current module // scope - in this case `my_mod`. // Calling `self::function_with_same_name()` and // calling `function_with_same_name()` directly both give // the same result, because they refer to the same function. self ::function_with_same_name(); function_with_same_name(); // We can also use `self` to access // another module inside `my_mod`: // We have `cool_mod` module inside `my_mod` // module which contains `function_with_same_name` self ::cool_mod::function_with_same_name(); // The `super` keyword refers to the parent scope // (outside the `my_mod` module). super ::function_with_same_name(); } } fn main() { my_mod::indirect_call(); } |
Выход:
Объяснение:
- Начнем с создания функции с именем «function_with_same_name» (мы выбрали это имя, чтобы вам было легче понять, что мы используем одно и то же имя для всех функций).
- Затем мы создаем модуль с именем «cool_mod», который содержит общедоступную функцию, также называемую «function_with_same_name».
- После этого мы создаем еще один модуль с именем «my_mod», который также содержит модуль с именем «cool_mod», который, в свою очередь, также содержит общедоступную функцию с именем «function_with_same_name».
- «my_mod» также содержит функцию с именем «function_with_same_name» и функцию с именем «indirect_call».
- Теперь мы посмотрим, что происходит внутри функции «indirect_call». Ключевое слово «self» относится к текущей области модуля — в данном случае «my_mod», что означает, что когда мы вызываем «function_with_same_name()» с использованием ключевого слова self, оно вызывает 'function_with_same_name()', который присутствует в модуле 'my_mod'.
- После этого, когда мы вызываем «function_with_same_name()» без использования ключевого слова self, выходные данные остаются прежними, поскольку они ссылаются на одну и ту же функцию в этой области.
- Теперь мы вызываем «function_with_same_name()» модуля «cool_mod», используя ключевое слово self.
- Теперь, используя ключевое слово super, мы вызываем «function_with_same_name()», который вызывает функцию с именем «function_with_same_name» в родительской области видимости.
- Как видите, ключевые слова self и super облегчают нашу работу.