英文:
How can I write a function that can be used to initialize a static?
问题
这段代码中的问题是这样的:
这段代码可以正常工作:
static mutex: std::sync::Mutex<Object> =
std::sync::Mutex::new(Object { field: BTreeMap::new() });
但这段代码却不能正常工作:
static mutex: std::sync::Mutex<Object> =
std::sync::Mutex::new(Object::new());
struct Object {
field: BTreeMap<String, String>,
}
impl Object {
fn new() -> Object {
Object { field: BTreeMap::new() }
}
}
问题出在 Object::new()
这个方法上,它返回的是 Object
的新实例,但是这个实例没有被包裹在 std::sync::Mutex
中。正确的解决方法是确保 Object::new()
返回的实例被正确包裹在 Mutex
中,就像第一个示例中那样。
解决方法是将 Object::new()
修改为返回一个被 Mutex
包裹的实例,如下所示:
static mutex: std::sync::Mutex<Object> =
std::sync::Mutex::new(Object::new());
struct Object {
field: BTreeMap<String, String>,
}
impl Object {
fn new() -> Object {
Object { field: BTreeMap::new() }
}
}
这样,你的代码就会正常工作了。
英文:
This works:
static mutex: std::sync::Mutex<Object> =
std::sync::Mutex::new(Object { field: BTreeMap::new() });
and this does not:
static mutex: std::sync::Mutex<Object> =
std::sync::Mutex::new(Object::new());
struct Object {
field: BTreeMap<String, String>,
}
impl Object {
fn new() -> Object {
Object { field: BTreeMap::new() }
}
}
Why, and what is the resolution?
答案1
得分: 1
一个函数只有在被标记为const
时才能作为static
变量的初始化器使用,这意味着它可以在编译时求值。
在const
函数内只有有限的功能可用。幸运的是,你的new()
函数中的所有内容都与const
兼容,因此将const
关键字添加到你的函数将修复编译器错误。
use std::collections::BTreeMap;
static mutex: std::sync::Mutex<Object> = std::sync::Mutex::new(Object::new());
struct Object {
field: BTreeMap<String, String>,
}
impl Object {
const fn new() -> Object {
Object {
field: BTreeMap::new(),
}
}
}
英文:
A function can only be used as an initializer for a static
variable if the function is marked const
, meaning, it can be evaluated at compile time.
Only a limited amount of functionality is available inside of a const
function. Luckily everything in your new()
function is compatible with const
, so adding the const
keyword to your function will fix your compiler error.
use std::collections::BTreeMap;
static mutex: std::sync::Mutex<Object> = std::sync::Mutex::new(Object::new());
struct Object {
field: BTreeMap<String, String>,
}
impl Object {
const fn new() -> Object {
Object {
field: BTreeMap::new(),
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论