mikecargal

mikecargal

Hands-on Rust: question about get_component

Title: Hands-on Rust: question about get_component (page 295)

(feel free to respond. “You dug you’re own hole… good luck”)

I have something wrong implementing the “adventurer isn’t an Octopus” code. (Pretty sure it’s “wrong” somewhere else in my code, since I checked and rechecked this specific code several times, but I’m trying to sort out what I may have wrong)

In trying to track down what I’ve done wrong I’ve changed some of the code as follows: (mainly to break a few things out and get some visibility with ```println!()`` calls (adding line numbers to match against stack trace). (also, unfortunately, since this is panicking, it’s actually on picking up the first sword, so not exactly the scenario I’m trying to eventually fix)

40 items 41 .iter(ecs) 42 .filter(|(_entity, _item, &item_pos)| item_pos == player_pos) 43 .for_each(|(entity, _item, _item_pos)| { 44 commands.remove_component::<Point>(*entity); 45 commands.add_component(*entity, Carried(player)); 46 if let Ok(e) = ecs.entry_ref(*entity) { 47 println!("Entity:{:#?}", e.archetype()); 48 let is_weapon = e.get_component::<Weapon>().is_ok(); 49 println!("Entity is weapon: {}", is_weapon); 50 <(Entity, &Carried, &Weapon)>::query() 51 .iter(ecs) 52 .filter(|(_, c, _)| { 53 let is_carried_by_player = c.0 == player; 54 println!( 55 "carried by player: {} {}", 56 is_carried_by_player, is_weapon 57 ); 58 is_carried_by_player && is_weapon 59 }) 60 .for_each(|(e, _, _)| { 61 println!("Remove Weapon Entity"); 62 commands.remove(*e) 63 }) 

For which, I get the following console output:

Entity:Archetype { index: ArchetypeIndex( 10, ), entities: [ Entity( 25, ), Entity( 24, ), Entity( 22, ), Entity( 47, ), Entity( 46, ), Entity( 45, ), Entity( 44, ), Entity( 40, ), Entity( 35, ), Entity( 33, ), Entity( 59, ), Entity( 58, ), Entity( 54, ), Entity( 48, ), Entity( 79, ), Entity( 76, ), ], layout: EntityLayout { components: [ ComponentTypeId { type_id: TypeId { t: 9061793563588654225, }, name: "bracket_geometry::point::Point", }, ComponentTypeId { type_id: TypeId { t: 8331237624739738968, }, name: "dungeoncrawl::components::Render", }, ComponentTypeId { type_id: TypeId { t: 18175530127838128523, }, name: "dungeoncrawl::components::Name", }, ComponentTypeId { type_id: TypeId { t: 14425425821466115813, }, name: "dungeoncrawl::components::Item", }, ComponentTypeId { type_id: TypeId { t: 1855713956641428298, }, name: "dungeoncrawl::components::Damage", }, ComponentTypeId { type_id: TypeId { t: 2499425021939920047, }, name: "dungeoncrawl::components::Weapon", }, ], component_constructors: [ 0x0000000100f9f170, 0x0000000100f9fb50, 0x0000000100fa0200, 0x0000000100f9f2e0, 0x0000000100f9fcd0, 0x0000000100f9f260, ], }, subscribers: Subscribers { len: 0, }, } Entity is weapon: false thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: AccessDenied', /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/query/mod.rs:340:65 stack backtrace: 0: rust_begin_unwind at /rustc/e1884a8e3c3e813aada8254edfa120e85bf5ffca/library/std/src/panicking.rs:495:5 1: core::panicking::panic_fmt at /rustc/e1884a8e3c3e813aada8254edfa120e85bf5ffca/library/core/src/panicking.rs:92:14 2: core::option::expect_none_failed at /rustc/e1884a8e3c3e813aada8254edfa120e85bf5ffca/library/core/src/option.rs:1268:5 3: core::result::Result<T,E>::unwrap at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/result.rs:973:23 4: legion::internals::query::Query<V,F>::iter_chunks_unchecked at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/query/mod.rs:340:24 5: legion::internals::query::Query<V,F>::iter_unchecked at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/query/mod.rs:484:9 6: legion::internals::query::Query<V,F>::iter at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/query/mod.rs:538:18 7: dungeoncrawl::systems::player_input::player_input::{{closure}} at ./src/systems/player_input.rs:50:29 8: core::iter::traits::iterator::Iterator::for_each::call::{{closure}} at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:675:29 9: core::iter::adapters::filter_fold::{{closure}} at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/mod.rs:1071:44 10: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/function.rs:269:13 11: core::iter::traits::iterator::Iterator::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:2023:21 12: <core::iter::adapters::flatten::FlattenCompat<I,U> as core::iter::traits::iterator::Iterator>::fold::flatten::{{closure}} at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/flatten.rs:332:30 13: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/function.rs:269:13 14: core::iter::adapters::map_fold::{{closure}} at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/mod.rs:905:21 15: core::iter::traits::iterator::Iterator::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:2023:21 16: <core::iter::adapters::fuse::Fuse<I> as core::iter::adapters::fuse::FuseImpl<I>>::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/fuse.rs:315:19 17: <core::iter::adapters::fuse::Fuse<I> as core::iter::traits::iterator::Iterator>::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/fuse.rs:106:9 18: <core::iter::adapters::Map<I,F> as core::iter::traits::iterator::Iterator>::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/mod.rs:945:9 19: <core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/chain.rs:123:19 20: <core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/chain.rs:120:19 21: <core::iter::adapters::flatten::FlattenCompat<I,U> as core::iter::traits::iterator::Iterator>::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/flatten.rs:335:9 22: <core::iter::adapters::flatten::Flatten<I> as core::iter::traits::iterator::Iterator>::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/flatten.rs:193:9 23: <core::iter::adapters::Filter<I,P> as core::iter::traits::iterator::Iterator>::fold at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/mod.rs:1135:9 24: core::iter::traits::iterator::Iterator::for_each at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:678:9 25: dungeoncrawl::systems::player_input::player_input at ./src/systems/player_input.rs:40:17 26: dungeoncrawl::systems::player_input::player_input_system::{{closure}} at ./src/systems/player_input.rs:10:1 27: <F as legion::internals::systems::system::SystemFn<R,Q>>::run at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/systems/system.rs:220:9 28: <legion::internals::systems::system::System<R,Q,F> as legion::internals::systems::schedule::Runnable>::run_unsafe at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/systems/system.rs:191:9 29: legion::internals::systems::schedule::Executor::run_recursive at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/systems/schedule.rs:384:9 30: legion::internals::systems::schedule::Executor::run_systems::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/systems/schedule.rs:353:34 31: <rayon::iter::for_each::ForEachConsumer<F> as rayon::iter::plumbing::Folder<T>>::consume at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/for_each.rs:47:9 32: <rayon::iter::filter::FilterFolder<C,P> as rayon::iter::plumbing::Folder<T>>::consume at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/filter.rs:123:24 33: rayon::iter::plumbing::Folder::consume_iter at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/plumbing/mod.rs:179:20 34: rayon::iter::plumbing::Producer::fold_with at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/plumbing/mod.rs:110:9 35: rayon::iter::plumbing::bridge_producer_consumer::helper at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/plumbing/mod.rs:438:13 36: rayon::iter::plumbing::bridge_producer_consumer::helper::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/plumbing/mod.rs:418:21 37: rayon_core::join::join_context::call_a::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/join/mod.rs:124:17 38: <std::panic::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panic.rs:322:9 39: std::panicking::try::do_call at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panicking.rs:381:40 40: ___rust_try 41: std::panicking::try at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panicking.rs:345:19 42: std::panic::catch_unwind at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panic.rs:396:14 43: rayon_core::unwind::halt_unwinding at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/unwind.rs:17:5 44: rayon_core::join::join_context::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/join/mod.rs:141:24 45: rayon_core::registry::in_worker at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/registry.rs:879:13 46: rayon_core::join::join_context at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/join/mod.rs:132:5 47: rayon::iter::plumbing::bridge_producer_consumer::helper at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/plumbing/mod.rs:416:47 48: rayon::iter::plumbing::bridge_producer_consumer at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/plumbing/mod.rs:397:12 49: <rayon::iter::plumbing::bridge::Callback<C> as rayon::iter::plumbing::ProducerCallback<I>>::callback at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/plumbing/mod.rs:373:13 50: <rayon::range::Iter<usize> as rayon::iter::IndexedParallelIterator>::with_producer at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/range.rs:112:17 51: rayon::iter::plumbing::bridge at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/plumbing/mod.rs:357:12 52: <rayon::range::Iter<usize> as rayon::iter::ParallelIterator>::drive_unindexed at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/range.rs:88:17 53: <rayon::iter::filter::Filter<I,P> as rayon::iter::ParallelIterator>::drive_unindexed at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/filter.rs:46:9 54: rayon::iter::for_each::for_each at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/for_each.rs:12:5 55: rayon::iter::ParallelIterator::for_each at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.0/src/iter/mod.rs:369:9 56: legion::internals::systems::schedule::Executor::run_systems at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/systems/schedule.rs:347:17 57: legion::internals::systems::schedule::Schedule::execute::{{closure}}::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/legion-0.3.1/src/internals/systems/schedule.rs:518:28 58: rayon_core::join::join::call::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/join/mod.rs:102:18 59: rayon_core::join::join_context::call_a::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/join/mod.rs:124:17 60: <std::panic::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panic.rs:322:9 61: std::panicking::try::do_call at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panicking.rs:381:40 62: ___rust_try 63: std::panicking::try at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panicking.rs:345:19 64: std::panic::catch_unwind at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panic.rs:396:14 65: rayon_core::unwind::halt_unwinding at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/unwind.rs:17:5 66: rayon_core::join::join_context::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/join/mod.rs:141:24 67: rayon_core::registry::Registry::in_worker_cold::{{closure}}::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/registry.rs:469:21 68: <rayon_core::job::StackJob<L,F,R> as rayon_core::job::Job>::execute::call::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/job.rs:113:21 69: <std::panic::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panic.rs:322:9 70: std::panicking::try::do_call at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panicking.rs:381:40 71: ___rust_try 72: std::panicking::try at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panicking.rs:345:19 73: std::panic::catch_unwind at /Users/mike/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/std/src/panic.rs:396:14 74: rayon_core::unwind::halt_unwinding at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/unwind.rs:17:5 75: <rayon_core::job::StackJob<L,F,R> as rayon_core::job::Job>::execute at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/job.rs:119:38 76: rayon_core::job::JobRef::execute at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/job.rs:59:9 77: rayon_core::registry::WorkerThread::execute at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/registry.rs:753:9 78: rayon_core::registry::WorkerThread::wait_until_cold at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/registry.rs:730:17 79: rayon_core::registry::WorkerThread::wait_until at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/registry.rs:704:13 80: rayon_core::registry::main_loop at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/registry.rs:837:5 81: rayon_core::registry::ThreadBuilder::run at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/registry.rs:56:18 82: <rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{{closure}} at /Users/mike/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.0/src/registry.rs:101:20 note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. 

So my questions are

1 - Am I completely misunderstanding what the archetype() function returns? It looks to me, like it says that the entity DOES have a Weapon component. However the e.get_component::<Weapon>().is_ok() call returns false

2 - Why am I getting an access denied panic (beyond the immediate "because you tried to unwrap() an Err (stupid)?
Item 7 on the stack trace points to my code, but it’s the <(Entity, &Carried, &Weapon)>::query() line and I’m not sure what about that could trigger a panic.

Marked As Solved

herbert

herbert

Author of Hands-on Rust

Glad that fixed it! I’ll add the read_component to the instructions in the next build. Thanks. :slight_smile:

Where Next?

Popular Pragmatic Bookshelf topics Top

jeffmcompsci
Title: Design and Build Great Web APIs - typo “https://company-atk.herokuapp.com/2258ie4t68jv” (page 19, third bullet in URL list) Typo:...
New
yulkin
your book suggests to use Image.toByteData() to convert image to bytes, however I get the following error: "the getter ‘toByteData’ isn’t...
New
mikecargal
Title: Hands-On Rust (Chapter 11: prefab) Just played a couple of amulet-less games. With a bit of debugging, I believe that your can_p...
New
alanq
This isn’t directly about the book contents so maybe not the right forum…but in some of the code apps (e.g. turbo/06) it sends a TURBO_ST...
New
fynn
This is as much a suggestion as a question, as a note for others. Locally the SGP30 wasn’t available, so I ordered a SGP40. On page 53, ...
New
creminology
Skimming ahead, much of the following is explained in Chapter 3, but new readers (like me!) will hit a roadblock in Chapter 2 with their ...
New
jwandekoken
Book: Programming Phoenix LiveView, page 142 (157/378), file lib/pento_web/live/product_live/form_component.ex, in the function below: d...
New
tkhobbes
After some hassle, I was able to finally run bin/setup, now I have started the rails server but I get this error message right when I vis...
New
dtonhofer
@parrt In the context of Chapter 4.3, the grammar Java.g4, meant to parse Java 6 compilation units, no longer passes ANTLR (currently 4....
New
gorkaio
root_layout: {PentoWeb.LayoutView, :root}, This results in the following following error: no “root” html template defined for PentoWeb...
New

Other popular topics Top

New
DevotionGeo
I know that these benchmarks might not be the exact picture of real-world scenario, but still I expect a Rust web framework performing a ...
New
PragmaticBookshelf
Rust is an exciting new programming language combining the power of C with memory safety, fearless concurrency, and productivity boosters...
New
AstonJ
I ended up cancelling my Moonlander order as I think it’s just going to be a bit too bulky for me. I think the Planck and the Preonic (o...
New
New
PragmaticBookshelf
Author Spotlight Jamis Buck @jamis This month, we have the pleasure of spotlighting author Jamis Buck, who has written Mazes for Prog...
New
Help
I am trying to crate a game for the Nintendo switch, I wanted to use Java as I am comfortable with that programming language. Can you use...
New
husaindevelop
Inside our android webview app, we are trying to paste the copied content from another app eg (notes) using navigator.clipboard.readtext ...
New
New
PragmaticBookshelf
A concise guide to MySQL 9 database administration, covering fundamental concepts, techniques, and best practices. Neil Smyth MySQL...
New

Sub Categories: