2015-06-10 7 views
24

Ich möchte Funktionen/Methoden als veraltet markieren. Ich versuchte, das deprecated Attribut anwenden:Kann ich eine Funktion als veraltet markieren?

#[deprecated] 
fn old_way_of_doing_it() { 

aber dies ergibt einen Fehler:

error: stability attributes may not be used outside of the standard library 

Gibt es eine Möglichkeit, in der ich die Compiler warnt einen Verbraucher meiner Bibliothek haben kann, die eine Funktion ist veraltet ?

Ich habe keine Erfahrung, aber ich überlege, mit Compiler-Plugins und benutzerdefinierten Attributen zu experimentieren, aber ich denke, dass der Verbraucher das Plugin auch verwenden müsste, was vielleicht unvernünftig ist (oder eine unangemessene Arbeit sein kann) mich zu implementieren?)

Als eine Seitenfrage aus Neugier, warum ist das veraltete Attribut nur für die Standardbibliothek anwendbar?

Antwort

16

Seit Rust 1.9.0 (2016 May 26th) können Sie das Attribut #[deprecated] in Ihren eigenen Kisten verwenden (RFC 1270). Die Syntax ist:

#[deprecated(since="0.5.0", note="please use `new_method` instead")] 
pub fn old_method() { ..; } 

Es wird die folgende Warnung werfen, wenn Sie old_method verwenden:

<anon>:6:5: 6:15 warning: use of deprecated item: please use `new_method` instead, #[warn(deprecated)] on by default 
<anon>:6  old_method() 
      ^~~~~~~~~~ 

Sie können mehr Informationen in der RFC finden.

6

Aktualisierung:#[deprecated] ist derzeit (wie von Februar 2016) in der Nacht verfügbar. Es sollte etwa Anfang März 2016 im Stall erhältlich sein.

Es gibt keine Möglichkeit, dies in externen Bibliotheken noch zu tun.

Doing es ist sehr wünschenswert (ich wollte es schon mehrmals), aber die Entscheidung wurde getroffen, Design und Implementierung Bemühungen auf Funktionalität konzentrieren, die von der Standardbibliothek bei 1.0 benötigt wurde, und die Optimierung eines Designs für externe verschieben Bibliotheken bis später. Die RFC bespricht es ein wenig:

It's important to note that these stability attributes are only known to be useful to the standard distribution, because of the explicit linkage to language versions and release channels. [...]. A general mechanism for indicating API stability will be reconsidered in the future.

[...]

With respect to stability attributes and Cargo, the proposed design is very specific to the standard library and the Rust compiler without being intended for use by third-party libraries. It is planned to extend Cargo's own support for features (distinct from Rust features) to enable this form of feature development in a first-class method through Cargo. At this time, however, there are no concrete plans for this design and it is unlikely to happen soon.

Es gab erhebliche Diskussion über den Antrag Pull selbst zu:

(Das RFC ist die kanonische Quelle für Informationen dazu.)

I have no experience, but I'm considering experimenting with compiler plugins and custom attributes, but I guess that would require the consumer to also use the plugin, which is maybe unreasonable (or may be an unreasonable amount of work for me to implement?)

Ja, es würde den Verbraucher erfordern, das Plugin zu verwenden, und ich bin nicht ganz sicher, ob der Compiler es für ein Plugin leicht macht, alle Informationen zu erhalten, die es benötigt, um das aktuelle eingebaute #[deprecated] zu emulieren.

Verwandte Themen