私は危険な呼び出しの結果にsomeval
を割り当て、後でsomeval
を使用したい:安全でない呼び出しの結果にvarを割り当て、安全ではない{}の中に他のすべてを入れ子にすることなくそのvarを後で使用するというイディオムはありますか?
fn partially_unsafe(item: *const scary_c_struct) -> i32 {
let someval = item.as_ref();
match someval {
Some(big_long_block) => {
//lots of lines of code
42
}
None => -1,
}
}
item.as_ref()
ニーズがunsafe
ブロックであることをので、これはコンパイルされません:
fn partially_unsafe(item: *const scary_c_struct) -> i32 {
unsafe {
let someval = item.as_ref();
match someval {
Some(big_long_block) => {
//lots of lines of code
42
}
None => -1,
}
}
}
この関数に他のネストされたブロックがたくさんあると面倒です。
私はこの表現を使用することができますが、これは不変性を覆す:
// ...
let mut someval = None;
unsafe {
someval = item.as_ref();
}
// ...
私はまた、独自の機能でitem.as_ref()
を隠すことができます。
これらのどれも満足のいくものではありません。安全でない課題を表現するのが面倒な方法はありませんか?
'partial_unsafe'関数は、' 'unsafe' 'unsafe fn partialy_unsafe ...'とマークすることをお勧めします。これは、Rust型システムと貸し出しチェッカーが確認できない契約を持っているからです。 '* const scary_c_struct'ポインタは有効です。そのような契約の存在を文書化することは、「安全でないfn」が存在する理由です。 – user4815162342