#user-interface #rust #fltk
Вопрос:
Я новичок в программировании на ржавчине. Здесь я разрабатывал приложение FLTK с использованием rust. Я получаю следующее предупреждение.
warning: field is never read: `group`
--> srcviewslogo.rs:13:5
|
13 | group: fltk::group::Group,
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
Почему на нем отображается предупреждение: поле никогда не читается: group
? Есть ли какой-то вариант устранения этого предупреждения?
мой код таков:
use fltk::{image::*,
frame::Frame,
group::Group,
enums::Color,
// enums::Align,
};
use fltk::prelude::*;
use std::fs::read;
pub struct LogoImage {
group: fltk::group::Group,
// // button: fltk::button::Button,
// logo_frame: Frame,
}
impl LogoImage {
pub fn new(x:i32, y:i32, w:i32, h:i32, label:amp;'static str) -> LogoImage {
let mut group = Group::new(x, y, w, h, label);
group.set_align(fltk::enums::Align::Center);
group.set_frame(fltk::enums::FrameType::FlatBox);
group.set_color(fltk::enums::Color::Red);
// group.set_type(fltk::group::PackType::Horizontal);
let mut logo_frame = Frame::default()
// .with_size(w, h)
.with_size(group.width(), group.height())
.center_of(amp;group)
.with_label("H");
logo_frame.set_frame(fltk::enums::FrameType::FlatBox);
logo_frame.set_color(Color::Yellow);
logo_frame.draw(|f| {
// let image_data = read("assets\app_icon.png").unwrap();
let mut img = PngImage::load("assets\app_icon.png").unwrap();
img.scale(f.w(), f.h(), true, true);
img.draw(f.x(), f.y(), f.w(), f.h());
});
group.end();
LogoImage {group} // , logo_frame
}
}
Могут ли некоторые объяснить мне это и дать решение (предпочитайте решение в коде, а не просто объяснение)?
Комментарии:
1. Этого поля нет
pub
, и нетpub
метода чтения из него. Таким образом, компилятор считает, что вы вполне можете опустить это поле вместе с инструкциями, записываемыми в него. Перед именем поля всегда можно поставить знак подчеркивания, чтобы сообщить компилятору, что оно может не использоваться, и подавить это предупреждение.2. если
pub
используется раньшеgroup: fltk::group::Group
, исчезнет ли это предупреждение? Структура уже являетсяpub
единой, верно? Тогда зачем сноваpub
нужна внутренняя часть?3. Может быть много причин скрывать внутренние части структур. Например, согласованность может быть нарушена при изменении какого-либо поля извне. Вот почему в полях структуры есть модификатор видимости.
4. @SantoK.
struct
Поля Тома (если они не аннотированыpub
) по умолчанию являются закрытыми для модуля, в котором они определены. И у вас нет функции, считывающей ее в том же модуле (который является областью, в которой это поле является общедоступным). Так что это считается никогда не прочитанным.5. @SantoK. Томас, я так думаю. Или вы можете переименовать это поле в
_group
(и, следовательно, в этом нет необходимостиpub
), чтобы предупреждение было подавлено и доступность поля не пострадала.
Ответ №1:
Сделайте внутренние (внутренние переменные) структуры либо намеренно начинающимися с _
(т. Е., _group
), чтобы избежать предупреждения, либо используйте pub перед внутренней переменной (т. Е., pub group ...
) и используйте ее в другом файле rs. Ответ:
use fltk::{image::*, frame::Frame, group::Group, enums::Color, // enums::Align, }; use fltk::prelude::*; use std::fs::read; pub struct LogoImage { _group: fltk::group::Group, // or pub group: ....... } impl LogoImage { pub fn new(x:i32, y:i32, w:i32, h:i32, label:amp;'static str) -> LogoImage { let mut group = Group::new(x, y, w, h, label); group.set_align(fltk::enums::Align::Center); group.set_frame(fltk::enums::FrameType::FlatBox); group.set_color(fltk::enums::Color::Red); // group.set_type(fltk::group::PackType::Horizontal); let mut logo_frame = Frame::default() // .with_size(w, h) .with_size(group.width(), group.height()) .center_of(amp;group) .with_label("H"); logo_frame.set_frame(fltk::enums::FrameType::FlatBox); logo_frame.set_color(Color::Yellow); logo_frame.draw(|f| { // let image_data = read("assets\app_icon.png").unwrap(); let mut img = PngImage::load("assets\app_icon.png").unwrap(); img.scale(f.w(), f.h(), true, true); img.draw(f.x(), f.y(), f.w(), f.h()); }); group.end(); LogoImage {group} // , logo_frame } }