来自C++,我很惊讶这段代码在Rust中是有效的:
let x = &mut String::new();
x.push_str("Hello!");
Run Code Online (Sandbox Code Playgroud)
在C++中,你不能取一个临时的地址,一个临时的不会比它出现的表达式更长.
临时居住在Rust多久了?既然x只是借用,谁是字符串的所有者?
从Rust库中读取文档时遇到了这段代码:
for (ent, pos, vel) in (&*entities, &mut pos_storage, &vel_storage).join() {
println!("Processing entity: {:?}", ent);
*pos += *vel;
}
Run Code Online (Sandbox Code Playgroud)
原始链接:https : //slide-rs.github.io/specs/08_join.html
&*实体在这里做什么。据我所知,它是在取消引用实体,然后再次引用它?
该防锈参考说:
赋值或复合赋值表达式的左操作数是左值上下文,一元借用的单个操作数也是如此.
[...]
在左值上下文中使用右值时,会创建并使用临时的未命名左值.
这种左值促销显然适用于借款:
let ref_to_i32 = &27; // a temporary i32 variable with value 27 is created
Run Code Online (Sandbox Code Playgroud)
但它似乎不适用于任务(虽然引用说的是所有左值上下文,而不仅仅是借用):
27 = 28; // error[E0070]: invalid left-hand side expression
Run Code Online (Sandbox Code Playgroud)
E0070的错误描述未提及此右值促销.这是参考文献中的错误还是确实有某种方法可以通过赋值或复合赋值表达式触发rvalue促销?
还有第三种左值上下文,参考描述也不正确.只要存在带有a的模式,ref绑定到该模式的左值就是左值上下文.事实证明,促销适用于这种情况:
let ref x = 3; // works
Run Code Online (Sandbox Code Playgroud)
显然,促销只对(复合)作业不起作用?
当在Rust中将指向函数的原始指针存储在Rust中时,程序的行为可能会根据原始指针的可变性以意想不到的方式改变。
使用const指针可以得到预期的结果。
也可以在操场上查看以下代码:
type ExternFn = unsafe extern "C" fn() -> ();
unsafe extern "C" fn test_fn() {
println!("Hello!");
}
mod mut_ptr {
use super::{ExternFn, test_fn};
#[derive(Debug, Eq, PartialEq)]
pub struct FunctionHolder {
function: *mut ExternFn,
}
impl FunctionHolder {
pub fn new() -> Self {
FunctionHolder {
function: (&mut (test_fn as ExternFn) as *mut _),
}
}
pub fn call(&self) {
if !self.function.is_null() {
unsafe { (&*self.function)(); }
}
}
}
}
mod const_ptr { …Run Code Online (Sandbox Code Playgroud)