What the function types are is vague

Offen
#1,971 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
35/100
Issue-Typ
Dokumentation
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
rust
Bereich
documentation

Rechercherichtung

Beginne mit dem Abschnitt zu Aufrufausdrücken in der Rust Reference und der in der Issue verlinkten Dokumentation zu fn aus der Standardbibliothek und vergleiche anschließend deren Beschreibungen mit dem Beispiel für einen unsafe-Funktionszeiger. Kläre, was den Aufrufausdruck gültig macht, und unterscheide zwischen Funktionselementtypen sowie sicheren und unsafe-Funktionszeigern; abgeschlossen, wenn die Formulierung in der Reference die angegebene Mehrdeutigkeit auflöst.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

A-functions

Call expressions - The Rust Reference says:

For non-function types, the expression f(...) uses the method on one of the following traits based on the function operand:

  • Fn or AsyncFn — shared reference.
  • FnMut or AsyncFnMut — mutable reference.
  • FnOnce or AsyncFnOnce — value.

The non-function types, as indicated by the link, refer to function item types.
Consider this example:

unsafe fn foo(i:i32){}
fn main(){
  let f = foo as unsafe fn(i32);
  unsafe{
    f(0);
 }
}

f is of type unsafe function pointer, fn - Rust says:

In addition, all safe function pointers implement Fn, FnMut, and FnOnce, because these traits are specially known to the compiler.

The wording emphasizes safe; in other words, unsafe function pointers don't implement Fn, FnMut, and FnOnce. Furthermore, the (unsafe)function pointers aren't function item types, so why is f(0) a valid call expression?

More details can be seen https://users.rust-lang.org/t/why-can-the-unsafe-function-pointer-be-as-the-function-operand/133182

Vorherrschende Sprache
Rust
Sterne
1.6k
Forks
618
Ø Merge
5 Std. 48 Min.
Gemergte PRs (30 T.)
3

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus rust-lang/reference

Alle Issues in rust-lang/reference

Ähnliche Issues

Weitere Issues zu Rust

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.