前提・実現したいこと
このページに記載されているGUIライブラリconrodを使用したプログラムのコンパイルが通りません。
発生している問題・エラーメッセージ
コンパイル(cargo build)すると下記エラーがでます。
error[E0311]: the parameter type `K` may not live long enough --> /home/apo/.cargo/registry/src/github.com-1ecc6299db9ec823/rusttype-0.2.3/src/support/bst/map.rs:81:19 | 81 | match node.force() { | ^^^^ | note: the parameter type `K` must be valid for the anonymous lifetime #1 defined on the function body at 77:9... --> /home/apo/.cargo/registry/src/github.com-1ecc6299db9ec823/rusttype-0.2.3/src/support/bst/map.rs:77:9 | 77 | / fn clone_subtree<K: Clone, V: Clone>( 78 | | node: node::NodeRef<marker::Immut, K, V, marker::LeafOrInternal>) 79 | | -> BTreeMap<K, V> { | |_________________________________^ error[E0311]: the parameter type `V` may not live long enough --> /home/apo/.cargo/registry/src/github.com-1ecc6299db9ec823/rusttype-0.2.3/src/support/bst/map.rs:81:19 | 81 | match node.force() { | ^^^^ | note: the parameter type `V` must be valid for the anonymous lifetime #1 defined on the function body at 77:9... --> /home/apo/.cargo/registry/src/github.com-1ecc6299db9ec823/rusttype-0.2.3/src/support/bst/map.rs:77:9 | 77 | / fn clone_subtree<K: Clone, V: Clone>( 78 | | node: node::NodeRef<marker::Immut, K, V, marker::LeafOrInternal>) 79 | | -> BTreeMap<K, V> { | |_________________________________^ error: aborting due to 2 previous errors error: could not compile `rusttype` To learn more, run the command again with --verbose. warning: build failed, waiting for other jobs to finish... error: build failed
該当のソースコード
./Cargo.toml
[package] name = "example_conrod" version = "0.1.0" authors = ["ogata-k <ogtkzk712@gmail.com>"] edition = "2018" [dependencies.conrod] version = "0.53.0" features = ["glium", "winit"] [dependencies] find_folder = "*"
./src/main.rs
Rust
1#[macro_use] 2extern crate conrod; 3extern crate find_folder; 4 5use conrod::{widget, color, Colorable, Borderable, Sizeable, Positionable, Labelable, Widget}; 6use conrod::backend::glium::glium; 7use conrod::backend::glium::glium::{DisplayBuild, Surface}; 8 9// 使用するid一覧 10widget_ids!( 11 struct Ids { 12 canvas, 13 num_lbl, 14 button, 15 }); 16 17fn main() { 18 // 設定値 19 const TITLE: &'static str = "カウントアップ"; 20 let width = 400; 21 let height = 300; 22 23 // windowの作成 24 let display = glium::glutin::WindowBuilder::new() 25 .with_dimensions(width, height) 26 .with_title(TITLE) 27 .build_glium() // windowの構築 28 .unwrap(); 29 30 // Uiの作成 31 let mut ui = conrod::UiBuilder::new([width as f64, height as f64]).build(); 32 33 // Uiで使うFontをassets以下のファイルからfont::Mapに追加 34 let assets = find_folder::Search::KidsThenParents(3, 5) 35 .for_folder("assets") 36 .unwrap(); 37 let font_path = assets.join("fonts/NotoSans/NotoSans-Regular.ttf"); 38 ui.fonts.insert_from_file(font_path).unwrap(); 39 40 // idを管理するための管理者の作成 41 let ids = &mut Ids::new(ui.widget_id_generator()); 42 43 // gliumで描画するためのrendererの準備 44 let mut renderer = conrod::backend::glium::Renderer::new(&display).unwrap(); 45 46 // The widgetとimageを結びつけて管理するmapping 47 let image_map = conrod::image::Map::<glium::texture::Texture2d>::new(); 48 49 50 let mut num = "0".to_string(); 51 52 let mut event_loop = EventLoop::new(); 53 // windowのイベントループ 54 'main: loop { 55 for event in event_loop.next(&display) { 56 // windowのイベントのハンドラーをuiにセット 57 if let Some(event) = conrod::backend::winit::convert(event.clone(), &display) { 58 ui.handle_event(event); 59 event_loop.needs_update(); 60 } 61 62 match event { 63 // Escapeはwindowの削除用に 64 glium::glutin::Event::KeyboardInput( 65 _, 66 _, 67 Some(glium::glutin::VirtualKeyCode::Escape), 68 ) | 69 glium::glutin::Event::Closed => break 'main, 70 _ => {} 71 } 72 } 73 74 75 set_widgets(ui.set_widgets(), ids, &mut num); 76 77 // Uiの描画とその表示 78 if let Some(primitives) = ui.draw_if_changed() { 79 renderer.fill(&display, primitives, &image_map); 80 let mut target = display.draw(); 81 target.clear_color(0.0, 0.0, 0.0, 1.0); 82 renderer.draw(&display, &mut target, &image_map).unwrap(); 83 target.finish().unwrap(); 84 } 85 } 86} 87 88// 配置するwidgetの配置方法の指定関数 89fn set_widgets(ref mut ui: conrod::UiCell, ids: &mut Ids, num: &mut String) { 90 // 背景(canvas) 91 widget::Canvas::new() 92 .pad(0.0) 93 .color(conrod::color::rgb(0.2, 0.35, 0.45)) 94 .set(ids.canvas, ui); 95 96 // canvasのidを使い指定することでuiからcanvasの横と縦の配列を取得 97 let canvas_wh = ui.wh_of(ids.canvas).unwrap(); 98 99 100 // 数値の表示 101 widget::Text::new(num) 102 .middle_of(ids.canvas) 103 .font_size(140) // フォントのサイズを指定!! 104 .color(color::WHITE) // 色の指定も簡単にできる 105 .set(ids.num_lbl, ui); 106 107 // カウントボタン 108 if widget::Button::new() 109 .w_h(canvas_wh[0] - 10.0, 40.0) // 幅 110 .mid_bottom_with_margin_on(ids.canvas, 5.0)// 位置 111 .rgb(0.4, 0.75, 0.6) // 色 112 .border(2.0) // 境界 113 .label("count +1") 114 .set(ids.button, ui) 115 .was_clicked() 116 { // if式の実行部分 117 if let Ok(count) = num.parse::<u32>() { 118 *num = (count+1).to_string(); 119 } else { 120 println!("invalid number"); 121 } 122 } 123 124} 125 126// イベントの管理用構造体 127struct EventLoop { 128 ui_needs_update: bool, 129 last_update: std::time::Instant, 130} 131 132impl EventLoop { 133 pub fn new() -> Self { 134 EventLoop { 135 last_update: std::time::Instant::now(), 136 ui_needs_update: true, 137 } 138 } 139 140 /// すべての更新対象となるイベントの為の順次取得用関数 141 pub fn next(&mut self, display: &glium::Display) -> Vec<glium::glutin::Event> { 142 // 60FPSより早くならないようにするために一つ前の更新対象から少なくても16ms待つことにしておく。 143 let last_update = self.last_update; 144 let sixteen_ms = std::time::Duration::from_millis(16); 145 let duration_since_last_update = std::time::Instant::now().duration_since(last_update); // 前回の更新時 と今の時間差の取得 146 if duration_since_last_update < sixteen_ms { 147 std::thread::sleep(sixteen_ms - duration_since_last_update); 148 } 149 150 // イベント全体の取得 151 let mut events = Vec::new(); 152 events.extend(display.poll_events()); // displayにおけるイベントの取得 153 154 // displayで更新があればUiでのイベント更新は次に持ち越し 155 if events.is_empty() && !self.ui_needs_update { 156 events.extend(display.wait_events().next()); 157 } 158 159 // イベントの更新の後処理 160 self.ui_needs_update = false; 161 self.last_update = std::time::Instant::now(); 162 163 events 164 } 165 166 // Uiで他のイベントの更新があるかないかを要求することをeventのループでは確認しておくこと 167 168 // これはいくつかのUiを描画する最初のタイミングや更新を要求するタイミングで使われる。 169 pub fn needs_update(&mut self) { 170 self.ui_needs_update = true; 171 } 172} 173 174
試したこと
コンパイラが古いのかと思い、updateしましたが変わりませんでした。
rustup update
補足情報(FW/ツールのバージョンなど)
OS: ArchLinux
cargo: cargo 1.48.0 (65cbdd2dc 2020-10-14)
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー