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
功能完成后,您将被丢弃。因此,您不能将引用存储在static
变量中:
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
. 有几种方法可以获得全局堆分配变量,如此处所述。在您的情况下,您可以使用thread_local
全局static
变量并将字符串包装在 a 中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));
}
推荐阅读
- powerbi - Power BI 中的索引和聚合函数
- javascript - 如何在函数运行后使按钮可见。反应原生
- c++ - 无法解决 C++ 中的内存读取和分段错误错误
- ios - Swift 中 simd_packed 向量的对齐(与 Metal Shader 语言相比)
- c# - 在 Web 应用程序上注册帐户后使用 sendgrid 发送电子邮件的问题
- python - 在 Python 中模拟实例化对象与类
- java - 如何从 Commands 类获取命令发送者到 DB 类
- bash - 从外部驱动器复制到 Box 文件夹的 Bash 脚本
- authentication - 如何在代理和重定向环境中捕获 HTTP 流量
- swift - Xcode || 仅在发布模式而不是在调试模式下添加 swift 包以避免增加编译时间