I want to find out the type of a variable in Rust:
use anyhow::Result;
use arti_client::{TorClient, TorClientConfig};
extern crate tokio;
#[tokio::main]
async fn main() -> Result<()> {
let config = TorClientConfig::default();
let tor_client = TorClient::create_bootstrapped(config).await?;
// What is the type of `tor_client`?
Ok(())
}
In order to find out the type of the variable tor_client
, I used std::any::type_name
:
use std::any::type_name;
fn type_of<T>(_: T) -> &'static str {
type_name::<T>()
}
[...]
println!("{}", type_of(tor_client));
The type printed to stdout is arti_client::client::TorClient<tor_rtcompat::PreferredRuntime>
.
I naively assumed that I can now declare the variable with that explicit type annotation:
use anyhow::Result;
use arti_client::{TorClient, TorClientConfig};
extern crate tokio;
#[tokio::main]
async fn main() -> Result<()> {
let config = TorClientConfig::default();
let tor_client: arti_client::client::TorClient<tor_rtcompat::PreferredRuntime> =
TorClient::create_bootstrapped(config).await?;
Ok(())
}
However, the compiler absolutely does not like that:
error[E0603]: module `client` is private
--> src/main.rs:52:34
|
52 | let tor_client: arti_client::client::TorClient<tor_rtcompat::PreferredRuntime> =
| ^^^^^^ private module
|
note: the module `client` is defined here
--> /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/arti-client-0.3.0/src/lib.rs:220:1
|
220 | mod client;
| ^^^^^^^^^^^
error: aborting due to previous error
What do I do wrong? I assume that the arti_client::client
module is private for a reason...
Background on why I want to find out the type and use explicit type annotation: I want to pass a reference to that variable to a custom function. As far as I understand it, I can not / should not declare a function parameter without knowing the type.
The
client
module is private, but this doesn't mean that you can't access the struct.To see the exact type as it is intended to be used, you can check the documentation for the method in question; the signature of the method is this:
where
Self
is an alias forarti_client::TorClient<tor_rtcompat::PreferredRuntime>
.As you can see, this type is indeed the
TorClient
, as thetype_name
told you, but it is scoped directly in thearti_client
crate root - not in theclient
module. To understand this difference, let's check the source:So:
client
is indeed private;struct TorClient
is defined there, and that's whattype_name
shows;