rust - 更改静态字符串值

标签 rust

我有一个静态可变值:

static mut ADDRESS: &'static str = "";

它是全局的,不在任何函数中。

现在我有一个问题:
我有读取此值的函数,它们工作正常,但是当我尝试创建从参数更改此值的函数时 - 它开始提示该值“活得不够长”。

#[no_mangle]
pub unsafe extern fn Java_Rust_setAddress(
    env: JNIEnv,
    _: JClass,
    address: JString
) {
    let input: String = env.get_string(address).expect("Couldn't get java string!").into();
    ADDRESS = &input /Error there/
}

我可以用它做什么?在每种情况下传输地址都不是一个变体,我确实需要一个简单的全局变量。

ADDRESS = input.as_str()

也不起作用。

但是

ADDRESS = "Something"

效果很好。

最佳答案

函数完成后,您的String将被删除。因此,您不能将引用存储在静态变量中:

ADDRESS = &input;
       // ^^^^^^ input does not live long enough
       // ADDRESS requires that `input` is borrowed for `'static`
}
// < `input` dropped here while still borrowed by ADDRESS

相反,您需要存储全局堆分配的String。有几种方法可以拥有全局堆分配变量 as explained here 。在您的情况下,您可以使用 thread_local 全局 static 变量并将字符串包装在 Cell 中,这提供了可变性:

use std::cell::Cell;

thread_local!(static ADDRESS: Cell<String> = Cell::new("".to_string()));

#[no_mangle]
pub unsafe extern fn Java_Rust_setAddress(
    env: JNIEnv,
    _: JClass,
    address: JString
) {
    let input: String = env.get_string(address).expect("Couldn't get java string!").into();
    ADDRESS.with(|address| address.set(input));
}

关于rust - 更改静态字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65266850/

相关文章:

rust - 如何使用 serde_json 和 Value 枚举处理可能缺失的字段?

module - 如果返回类型位于私有(private)模块后面,如何指定它?

git - 无法将文件夹 www 添加到 github 存储库

rust - 为什么特质不能 self 构建?

dynamic - 在 C# 中是否有等同于 `dynamic` 的 Rust?

string - char 到 string 转换的所有权问题

rust - 是否存在可用于引用切片的最后 N 个元素的范围表达式?

rust - 是否可以在函数内有条件地编译代码块?

rust - Gdb:目标远程连接在错误的地方?

rust - 如何查看 TcpStream 并阻塞直到有足够的字节可用?