Обычно для таких целей используются FFI (Foreign Function Interface) или аналогичные либы, которые облегчают жизнь. Если вопрос по коду на Lua, C или Rust, который не известен до момента исполнения, можно сделать что-то в духе:
Lua из Rust
Для Lua скриптов можно юзать `rlua` или `mlua`. Эти либы позволяют загружать и выполнять Lua скрипты в рантайме.
Пример кода с использованием `mlua`:
use mlua::Lua;
fn main() -> mlua::Result<()> {
let lua = Lua::new();
lua.load(r#"
print("Hello from Lua!")
"#).exec()?;
Ok(())
}
C из Rust
Rust имеет на борту поддержку для вызова функций C через FFI. Объявляешь функции C с помощью ключевого слова `extern` и потом вызываешь их напрямую в Rust.
Пример объявления и вызова функции C:
extern "C" {
fn c_function(arg: c_int) -> c_int;
}
fn main() {
unsafe {
c_function(5);
}
}
Динамическая загрузка функций Rust
Для вызова функций Rust, которые не известны на этапе компиляции, нужно использовать DLLs на Windows или shared objects - .so на Unix-подобных системах. Компилишь функции Rust в такую библиотеку и загружаешь их в
в рантайм с помощью библиотеки `libloading`.
Пример кода с использованием `libloading`:
use libloading::{Library, Symbol};
fn main() {
let lib = Library::new("path_to_library.so").unwrap();
unsafe {
let func: Symbol<unsafe extern fn() -> ()> = lib.get(b"my_function").unwrap();
func();
}
}
Единственное, важно помнить, что в случае с FFI и загрузкой библиотек в рантайме, тебе придётся использовать `unsafe` код в Rust, так как компилятор не может гарантировать безопасность операций через языковые границы, так что, аккуратней.