Определение признаков в отдельном файле

Я определяю две структуры

  pub struct Rect {pub width: f32, pub length: f32}//andpub struct Circle {pub radius: f32}  

Затем я определяю черту Area и реализую эту черту как для Circle , так и для Rect . Все работает нормально, когда я помещаю весь исходный код в один файл main.rs .

Теперь я хочу организовать свой исходный код. В частности, я хочу создать папку /src/geometry , создать три файла rs в этой папке:

 ///src/geometry/rect.rspub struct Rect {ширина публикации: f32, длина публикации: f32}  
 ///src/ geometry/circle.rspub struct Circle {pub radius: f32}  

и

 ///src/geometry/traits.  rspub trait Area {fn area (& self) -> f32;}  

И, наконец, я хочу использовать эти структуры из main.rs .

Я потратил пару дней, прочитал все примеры, которые нашел в Интернете, но все еще не могу заставить его работать. Есть предложения?

ОБНОВЛЕНИЕ : Структура проекта:

  src geometry rect.rs circle.rs traits.  rs geometry.rs main.rs  
 //rect.rspub struct Rect {pub width: f32, pub length: f32} impl Area for Rect {fn area  (& self) -> f32 {self.width * self.length}} impl Perimeter for Rect {fn perimeter (& self) -> f32 {2.0 * (self.width + self.length)}}  
 //circle.rspub struct Circle {pub radius: f32} impl Area for Circle {fn area (& self) -> f32 {3.14 * self.radius * self.radius}} impl  Perimeter for Circle {fn perimeter (& self) -> f32 {2.0 * 3.14 * self.radius}}  
 //traits.rspub trait Perimeter {fn perimeter  (& self) -> f32;} pub trait Area {fn area (& self) -> f32;}  
 //geometry.rspub mod rect; pub mod  circle;  
 //main.rsmod geometry; использовать geometry :: rect :: Rect; use geometry :: circle :: Circle; fn main () {  let rect = Rect {ширина: 1.0, длина: 2.0};  пусть круг = Круг {радиус: 2.3};  println! ("{}", rect.area ());  println! ("{}", circle.area ());}  

MSGS ОШИБКА КОМПИЛЯТОРА

  error [E0405]  : не удалось найти трейт `Area` в этой области -> src/geometry/rect.rs: 6: 6 | 6 |  impl Область для Rect {|  ^^^^ не найдено в этой ошибке области видимости [E0405]: не удается найти трейт `Perimeter` в этой области действия -> src/geometry/rect.rs: 12: 6 | 12 |  impl Периметр для Rect {|  ^^^^^^^^^ не найден в этой ошибке осциллографа [E0405]: не удается найти трейт `Area` в этой области -> src/geometry/circle.rs: 5: 6 | 5 |  impl Area for Circle {|  ^^^^ не найден в этой области. Ошибка [E0405]: не удается найти трейт `Perimeter` в этой области -> src/geometry/circle.rs: 11: 6 | 11 |  Im Perimeter for Circle {|  ^^^^^^^^^ не найден в этой области. ошибка: прерывание из-за 4 предыдущих ошибок. Для получения дополнительной информации об этой ошибке попробуйте `rustc --explain E0405`. ошибка: не удалось скомпилировать` chapter10`.  

Прежде всего, в circle.rs и rect.rs вам нужно чтобы добавить , используйте crate :: geometry :: traits :: {Area, Perimeter}; : это устраняет ошибки, которые вы вставили.

Затем в main.rs вам необходимо использовать geometry :: traits :: Area; , иначе вы не сможете вызвать .area () метод. Для этого вам необходимо сделать модуль traits общедоступным в geometry.rs : pub mod traits; (или, по крайней мере, public в ящике: pub (crate) mod traits; ).

Лично я бы также переименовал geometry.rs в geometry/mod.rs .



Создание отдельного файла для main, interface и class

Я начинаю учиться создавать C # и использовать интерфейс и класс. Может ли кто-нибудь научить меня, как отделить мой класс от моего интерфейса и при этом поддерживать их соединение друг с другом?

Причина: если я буду обновлять свой код, я буду знать, где их добавить, и на моем экране будет меньше кода.

  namespace Car {  class MainClass {//Мой интерфейс interface ICar {int gas {get;  набор;  }//void refuel ();  int getGasLeft ();  }//Мой класс class Car: ICar {public int gas {get;  набор;  } public Car (строка _name) {name = _name;  dist = 0;  газ = 40;  } public void refuel (int lit) {gas + = lit;  } public int getGasLeft () {возврат газа;  }}//Главный публичный статический void Main (string [] args) {Car toyota = new Car ();  toyota.drive (100);  toyota.refuel (5);  Console.WriteLine ("Имя:" + toyota.name + " nGas Left:" + toyota.getGasLeft ());  Console.ReadLine ();  }}}  

В C # пространство имен — это способ связывать файлы из разных мест.

Например, вы можете создать папку Interfaces и поместить туда свой ICar . Я покажу вам пример из моего проекта.

Моя структура папок выглядит так:

В моем ViewModel.cs я использую объект с именем FakeData . Как видно ниже, класс FakeData находится в пространстве имен TaskManager.Models .

Теперь мы переходим к нашему проекту и смотрим на папку Models .

В C #, когда вы создаете папку и класс в ней, вы получаете пространство имен на основе имени вашей папки. Конечно, вы можете это изменить. Вы можете редактировать пространство имен по своему усмотрению.

В В вашем случае вы можете просто создать папку с именем Interfaces . Щелкните правой кнопкой мыши, затем выберите «Новый класс» и дайте ему имя, например, Icar.cs . Вставьте туда свой код. Пространством имен по умолчанию будет ProjectName.Interfaces . Сделайте свой интерфейс общедоступным . Затем вы можете вызвать свой интерфейс, добавив using ProjectName.Interfaces в начало вашего основного класса. Тогда вы можете выполнить Main: ICar без ошибок.

Та же идея с классом Car . Вы можете создать папку с именем Models и класс в ней с именем Cars.cs . У него будет пространство имен ProjectName.Models . Если вы хотите использовать свой интерфейс, который находится в папке Interfaces , вам необходимо добавить пространство имен в свой класс Car.cs . В вашем случае это будет выглядеть как с использованием ProjectName.Interfaces . Затем вы можете вызвать интерфейс в Car.cs без каких-либо ошибок.

Не стесняйтесь задавать мне любые вопросы по этому поводу. Я постараюсь вам помочь.


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

В вашем случае создайте новый файл с именем ICar.cs в той же папке и объявите его как открытый интерфейс в том же пространстве имен.

1

Оцените статью
clickpad.ru
Добавить комментарий