error[E0599]: no method named `x` found for struct `T` in the current scope — how to fix
error[E0599]: no method named `read_to_string` found for struct `File` in the current scope
--> src/main.rs:5:10
|
5 | file.read_to_string(&mut s)?;
| ^^^^^^^^^^^^^^ method not found in `File`
|
= help: items from traits can only be used if the trait is in scope
help: trait `Read` which provides `read_to_string` is implemented but not in scope; perhaps you want to import it
|
1 + use std::io::Read;
|
Quick fix: Read the help: lines: if a trait provides the method, add the suggested use (e.g. use std::io::Read;, use std::io::Write;, use futures::StreamExt;). If the value is an Option/Result, unwrap it first (x?.method()). For generics, add the trait bound (T: Display). For crate methods, enable the needed feature in Cargo.toml.
What it means
Method lookup in Rust checks the type's inherent impl blocks and every trait that is in scope and implemented for the type (after auto-deref). E0599 means none of them has a method with that name. The compiler's help: notes are usually exactly right, so read them first.
Cause 1: the trait isn't imported
Trait methods are only callable when the trait is in scope.
use std::fs::File;
fn main() -> std::io::Result<()> {
let mut file = File::open("a.txt")?;
let mut s = String::new();
file.read_to_string(&mut s)?; // E0599
Ok(())
}
Fix: use std::io::Read;. Common ones:
| Method | Import |
|---|---|
read_to_string, read_exact |
use std::io::Read; |
write_all, flush |
use std::io::Write; |
lines() on a BufReader |
use std::io::BufRead; |
.next().await on a stream |
use futures::StreamExt; / use tokio_stream::StreamExt; |
read_to_end().await (tokio) |
use tokio::io::AsyncReadExt; |
fmt helpers like write! into String |
use std::fmt::Write; |
rng.gen_range() |
use rand::Rng; |
Many crates offer a prelude: use some_crate::prelude::*;.
Cause 2: the value is wrapped
Option<T>, Result<T, E>, Vec<T> don't have T's methods:
let n: Option<String> = Some("hi".into());
n.len(); // E0599: no method named `len` found for enum `Option`
Fix: unwrap or map:
let len = n.as_ref().map(|s| s.len()).unwrap_or(0);
// or in a function returning Result/Option:
let file = File::open(path)?; // ? unwraps the Result
Forgetting ? after a fallible call is the classic case: File::open(p).read_to_string(..) fails because read_to_string is called on the Result.
Cause 3: missing trait bound on a generic
fn show<T>(x: T) -> String {
x.to_string() // E0599: method `to_string` exists but trait bounds were not satisfied
}
Fix: require the trait:
fn show<T: std::fmt::Display>(x: T) -> String {
x.to_string()
}
Similarly .clone() needs T: Clone, .iter()-based helpers may need T: IntoIterator. For derived traits on your own types, add #[derive(Debug, Clone, PartialEq)].
Cause 4: iterator vs collection
Iterator adapters exist on iterators, not on Vec or arrays:
let v = vec![1, 2, 3];
v.map(|x| x * 2); // E0599
let doubled: Vec<_> = v.iter().map(|x| x * 2).collect();
And .collect() / .sum() need a type: let total: i32 = v.iter().sum();.
Cause 5: wrong name, version or disabled feature
- Typo or the method was renamed in a newer crate version; check docs.rs for the exact version in
Cargo.lock(cargo tree -i crate_name). - The method is behind a Cargo feature, e.g.
serde_json'spreserve_order,tokio'sfs/net/macros,reqwest'sjson:
[dependencies]
reqwest = { version = "0.12", features = ["json"] }
tokio = { version = "1", features = ["full"] }
- Two versions of the same crate in the tree: the trait you imported is from version A, the type is from version B.
cargo tree -dshows duplicates; align the versions.
Cause 6: associated function called as a method
String::from and Vec::with_capacity have no self. Call them with Type::func(...), not value.func(...). The compiler says "this is an associated function, not a method".
Last updated 2026-11-07.