呼び出された場所のファイルと行番号にアクセスする関数を書きたいと思います。
次のようになります。
fn main() {
prints_calling_location(); // would print `called from line: 2`
prints_calling_location(); // would print `called from line: 3`
}
fn prints_calling_location() {
let caller_line_number = /* ??? */;
println!("called from line: {}", caller_line_number);
}
RFC 2091:暗黙的な呼び出し元の場所は、track_caller
関数がその呼び出し元の場所にアクセスできるようにする機能を追加します。
簡単な答え:関数が呼び出される場所を取得するには、関数にマークを付けて本体で#[track_caller]
使用std::panic::Location::caller
します。
その答えに続いて、あなたの例は次のようになります:
#![feature(track_caller)]
fn main() {
prints_calling_location(); // would print `called from line: 2`
prints_calling_location(); // would print `called from line: 3`
}
#[track_caller]
fn prints_calling_location() {
let caller_location = std::panic::Location::caller();
let caller_line_number = caller_location.line();
println!("called from line: {}", caller_line_number);
}
具体的には、この関数にstd::panic::Location::caller
は2つの動作があります。
#[track_caller]
返します&'static Location<'static>
。を持たない関数内では、関数#[track_caller]
が呼び出される場所ではなく、呼び出した実際の場所を返すというエラーが発生しやすい動作があります。次に例を示します。
#![feature(track_caller)]
fn main() {
oops();
// ^ prints `line: 10` instead of the expected `line: 4`
}
// note: missing #[track_caller] here
fn oops() {
println!("line: {}", std::panic::Location::caller().line());
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加