Rust: mendeteksi kapan "parameter tipe tidak dibatasi" dapat diberikan secara eksplisit ke panggilan fn

Dibuat pada 21 Feb 2017  ·  3Komentar  ·  Sumber: rust-lang/rust

Membangun https://github.com/rust-lang/rust/pull/39361 , kami mungkin ingin mempertimbangkan kapan pengguna harus menambahkan parameter tipe eksplisit ke panggilan fn. Saya membayangkan contoh seperti ini:

fn foo<T>() { }

fn main() {
    foo();
}

Akan lebih baik untuk menyarankan agar pengguna menulis foo::<T> untuk beberapa T eksplisit. Ini akan membutuhkan sedikit pemikiran:

Kapan kami ingin menyarankan ini sebagai preferensi untuk memberi anotasi pada variabel lokal? Saya lebih suka melampirkan anotasi pada variabel lokal, tetapi mungkin tidak jika jenis variabel lokal adalah beberapa hal kompleks yang menyebutkan jenis yang tidak disimpulkan jauh di dalamnya, sedangkan membubuhi keterangan fungsi akan memungkinkan kita untuk menentukan jenis yang tidak disimpulkan secara langsung .

Sebuah contoh:

fn foo<T>() -> Option<T> { }

fn main() {
    let x = foo();
}

Haruskah kami menyarankan pelabelan x: Option<T> atau foo::<T> ? Kasus ini adalah garis batas, tetapi jika Anda mengganti Option dengan beberapa jenis yang lebih kompleks, keseimbangan semakin miring.

Apa yang kita lakukan ketika fn mengambil banyak jenis, dan kita mengetahuinya sebagian? Kami mengesampingkan masalah sebelumnya tentang apa yang harus dilakukan ketika kami memiliki beberapa informasi tetapi tidak semua. Tapi rasanya di sini mungkin lebih penting. Sebuah contoh:

fn foo<T, U>() -> T { }

fn main() {
    let x: i32 = foo();
}

Di sini kita tahu T , tetapi tidak U . Haruskah kami menyarankan foo::<_, XXX> ? Bagaimana kami mengungkapkan XXX untuk menunjukkan kepada pengguna bahwa ini adalah hal yang perlu mereka berikan?

cc @cengizIO -- menarik untuk diikuti?

cc @estebank @jonathandturner -- pendapat tentang cara membuat frasa?

A-diagnostics C-enhancement E-needs-mentor T-compiler WG-compiler-errors

Komentar yang paling membantu

keluaran saat ini:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required

Beberapa opsi:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required
   = note: generic parameter `U` needs to be specified for foo::<T, U>()
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |                  |
   |                  you can specify the generic parameter here using `foo::<_, U>()`
   |
   = note: generic parameter `U` needs to be specified for `fn foo::<T, U>() -> T`
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U` in `fn foo<T, U>() -> T`
   |                  |
   |                  specify `U` using `foo::<_, U>()`
   |

Semua 3 komentar

Halo @nikomatsakis

Saya akan mengerjakan ini.

Terima kasih lagi!

keluaran saat ini:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required

Beberapa opsi:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required
   = note: generic parameter `U` needs to be specified for foo::<T, U>()
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |                  |
   |                  you can specify the generic parameter here using `foo::<_, U>()`
   |
   = note: generic parameter `U` needs to be specified for `fn foo::<T, U>() -> T`
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U` in `fn foo<T, U>() -> T`
   |                  |
   |                  specify `U` using `foo::<_, U>()`
   |

Catatan ini secara khusus membuat mata saya berkaca-kaca:

   = note: type annotations or generic parameter binding required

Mari kita pasti menghapus yang itu. :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat