関数が呼び出されるたびに、関数の呼び出し場所にアクセスするにはどうすればよいですか?

timotree

呼び出された場所のファイルと行番号にアクセスする関数を書きたいと思います。

次のようになります。

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);
}
timotree

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]

編集
0

コメントを追加

0

関連記事

分類Dev

関数が再度呼び出された場合、関数の最初の呼び出しの実行を停止するにはどうすればよいですか?

分類Dev

関数Bが呼び出された後にのみ関数Aが呼び出されるようにするにはどうすればよいですか?

分類Dev

特定の関数が呼び出されたときに関数を呼び出す関数を作成するにはどうすればよいですか?

分類Dev

Openerp-特定のビューが呼び出されるたびに実行する関数を呼び出すにはどうすればよいですか?

分類Dev

呼び出された関数自体がコンテキスト内にある場合に、nodejs vmスクリプト関数呼び出しがコンテキストを失うのを防ぐにはどうすればよいですか?

分類Dev

関数の呼び出しで例外がスローされた場合に処理を続行するにはどうすればよいですか?

分類Dev

関数が呼び出されるたびに、関数を別の関数に追加するにはどうすればよいですか?

分類Dev

複数の候補がある場合に正しい関数が呼び出されるようにするにはどうすればよいですか?

分類Dev

呼び出された関数の構造要素にアクセスするにはどうすればよいですか?

分類Dev

Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

分類Dev

Javascriptで、関数内で呼び出されたが他の場所で定義された関数から関数スコープの変数を参照するにはどうすればよいですか?

分類Dev

他の関数が呼び出された回数に基づいてスイッチ関数を操作するにはどうすればよいですか?

分類Dev

Nodeで関数が呼び出される場所のファイル名と行番号を取得するにはどうすればよいですか?

分類Dev

Pythonのクラス呼び出しに挿入された関数の数を保存するにはどうすればよいですか?

分類Dev

関数が呼び出された行番号を取得するにはどうすればよいですか?

分類Dev

グローバル環境で定義された関数に、呼び出し元の関数の環境で定義された変数にアクセスさせるにはどうすればよいですか?

分類Dev

%prunでリストされた関数の呼び出しを担当する関数を特定するにはどうすればよいですか?

分類Dev

関数が呼び出されるたびに新しい配列を動的に作成するにはどうすればよいですか?

分類Dev

アラートが呼び出された場合に関数を停止するにはどうすればよいですか?

分類Dev

呼び出しているクラスと関数を知るにはどうすればよいですか?

分類Dev

別の関数に時間がかかる場合、別の関数の完了後に関数を呼び出すにはどうすればよいですか?

分類Dev

事前定義された関数を呼び出して、その関数内にある変数のプロパティにアクセスするにはどうすればよいですか?

分類Dev

別のスクリプトが終了した後に実行するJavaScript関数を呼び出すにはどうすればよいですか?

分類Dev

別のファイルから関数を呼び出すときにViewControllerでUIViewにアクセスするにはどうすればよいですか?

分類Dev

LoopingCallによってスケジュールされた関数の呼び出し数を設定するにはどうすればよいですか?

分類Dev

Rust-関数が呼び出されるスコープ外でアクセスできるように、関数から複数の変数を返すにはどうすればよいですか?

分類Dev

関数から呼び出された値を分割するにはどうすればよいですか?

分類Dev

親の関数が子から呼び出されたかどうかをテストするにはどうすればよいですか?

分類Dev

テストしている関数内で呼び出される関数をモックするにはどうすればよいですか?

Related 関連記事

  1. 1

    関数が再度呼び出された場合、関数の最初の呼び出しの実行を停止するにはどうすればよいですか?

  2. 2

    関数Bが呼び出された後にのみ関数Aが呼び出されるようにするにはどうすればよいですか?

  3. 3

    特定の関数が呼び出されたときに関数を呼び出す関数を作成するにはどうすればよいですか?

  4. 4

    Openerp-特定のビューが呼び出されるたびに実行する関数を呼び出すにはどうすればよいですか?

  5. 5

    呼び出された関数自体がコンテキスト内にある場合に、nodejs vmスクリプト関数呼び出しがコンテキストを失うのを防ぐにはどうすればよいですか?

  6. 6

    関数の呼び出しで例外がスローされた場合に処理を続行するにはどうすればよいですか?

  7. 7

    関数が呼び出されるたびに、関数を別の関数に追加するにはどうすればよいですか?

  8. 8

    複数の候補がある場合に正しい関数が呼び出されるようにするにはどうすればよいですか?

  9. 9

    呼び出された関数の構造要素にアクセスするにはどうすればよいですか?

  10. 10

    Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

  11. 11

    Javascriptで、関数内で呼び出されたが他の場所で定義された関数から関数スコープの変数を参照するにはどうすればよいですか?

  12. 12

    他の関数が呼び出された回数に基づいてスイッチ関数を操作するにはどうすればよいですか?

  13. 13

    Nodeで関数が呼び出される場所のファイル名と行番号を取得するにはどうすればよいですか?

  14. 14

    Pythonのクラス呼び出しに挿入された関数の数を保存するにはどうすればよいですか?

  15. 15

    関数が呼び出された行番号を取得するにはどうすればよいですか?

  16. 16

    グローバル環境で定義された関数に、呼び出し元の関数の環境で定義された変数にアクセスさせるにはどうすればよいですか?

  17. 17

    %prunでリストされた関数の呼び出しを担当する関数を特定するにはどうすればよいですか?

  18. 18

    関数が呼び出されるたびに新しい配列を動的に作成するにはどうすればよいですか?

  19. 19

    アラートが呼び出された場合に関数を停止するにはどうすればよいですか?

  20. 20

    呼び出しているクラスと関数を知るにはどうすればよいですか?

  21. 21

    別の関数に時間がかかる場合、別の関数の完了後に関数を呼び出すにはどうすればよいですか?

  22. 22

    事前定義された関数を呼び出して、その関数内にある変数のプロパティにアクセスするにはどうすればよいですか?

  23. 23

    別のスクリプトが終了した後に実行するJavaScript関数を呼び出すにはどうすればよいですか?

  24. 24

    別のファイルから関数を呼び出すときにViewControllerでUIViewにアクセスするにはどうすればよいですか?

  25. 25

    LoopingCallによってスケジュールされた関数の呼び出し数を設定するにはどうすればよいですか?

  26. 26

    Rust-関数が呼び出されるスコープ外でアクセスできるように、関数から複数の変数を返すにはどうすればよいですか?

  27. 27

    関数から呼び出された値を分割するにはどうすればよいですか?

  28. 28

    親の関数が子から呼び出されたかどうかをテストするにはどうすればよいですか?

  29. 29

    テストしている関数内で呼び出される関数をモックするにはどうすればよいですか?

ホットタグ

アーカイブ