我想写一个函数,它可以访问文件和调用它的位置的行号。
它看起来像这样:
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);
}
2条答案
按热度按时间w9apscun1#
RFC 2091: Implicit caller location添加了
track_caller
特性,该特性允许函数访问其调用者的位置。简短的回答:要获得函数被调用的位置,请将其标记为
#[track_caller]
,并在其主体中使用std::panic::Location::caller
。根据这个答案,你的例子看起来像这样:
playground link
更具体地说,函数
std::panic::Location::caller
有两个行为:#[track_caller]
的函数中,它返回一个&'static Location<'static>
,您可以使用它来查找调用函数的文件、行号和列号。#[track_caller]
的函数中,它有一个容易出错的行为,即返回调用它的实际位置,而不是函数被调用的位置,例如:playground link
szqfcxe22#
使用“隐式调用者位置”的另一种选择(无论出于何种原因,它可能对您不可用/不适合)是用C方式来做事情。即将您的函数隐藏在宏后面。
playground link