superself

可以在路径中使用 super (父级)和 self(自身)关键字,从而在访问项时消除 歧义,以及防止不必要的路径硬编码。

  1. fn function() {
  2. println!("called `function()`");
  3. }
  4. mod cool {
  5. pub fn function() {
  6. println!("called `cool::function()`");
  7. }
  8. }
  9. mod my {
  10. fn function() {
  11. println!("called `my::function()`");
  12. }
  13. mod cool {
  14. pub fn function() {
  15. println!("called `my::cool::function()`");
  16. }
  17. }
  18. pub fn indirect_call() {
  19. // 让我们从这个作用域中访问所有名为 `function` 的函数!
  20. print!("called `my::indirect_call()`, that\n> ");
  21. // `self` 关键字表示当前的模块作用域——在这个例子是 `my`。
  22. // 调用 `self::function()` 和直接调用 `function()` 都得到相同的结果,
  23. // 因为他们表示相同的函数。
  24. self::function();
  25. function();
  26. // 我们也可以使用 `self` 来访问 `my` 内部的另一个模块:
  27. self::cool::function();
  28. // `super` 关键字表示父作用域(在 `my` 模块外面)。
  29. super::function();
  30. // 这将在 *crate* 作用域内绑定 `cool::function` 。
  31. // 在这个例子中,crate 作用域是最外面的作用域。
  32. {
  33. use crate::cool::function as root_function;
  34. root_function();
  35. }
  36. }
  37. }
  38. fn main() {
  39. my::indirect_call();
  40. }