rhaiscript / rhai

Rhai - An embedded scripting language for Rust.
https://crates.io/crates/rhai
Apache License 2.0
3.83k stars 180 forks source link

arguments lost in nested object calls? #932

Open stargazing-dino opened 1 week ago

stargazing-dino commented 1 week ago

I register a function that operates on a function pointer

let mut engine = Engine::new();

engine.register_fn("name_of_function", |x: &mut FnPtr| {
    println!("name of function: {:?}", x.fn_name());
});
fn my_cool_function() {
    // 
}

my_cool_function.name_of_function()

This successfully prints "my_cool_function". The signature of name_of_function is also correctly (Fn)

I then read about JS Style scriptable event handlers and am inspired to make a map for my function state:

let map = #{ foo: 42 };

fn my_cool_function() {
    this.foo += 1;
    // 
}

map.my_cool_function();

This pattern is useful and seems to work for my purposes.

However, doing this does not work.

map.my_cool_function.name_of_function();

I get this error:

called `Result::unwrap()` on an `Err` value: ErrorFunctionNotFound("name_of_function (())", 16:23)

Is this expected behavior?

schungx commented 6 days ago

Rhai is not JavaScript. Therefore methods are not stored as properties in the hash map.

map.my_cool_function() means my_cool_function(map), in Rust style, not JavaScript style.

Therefore, map has no property named my_cool_function.