Wie mache ich eine Rost-Element öffentlichkeit in einer Kiste, aber auch privat-außerhalb?
Habe ich eine Kiste, die viel code, also habe ich es aufgeteilt in mehrere Dateien/Module. Jedoch, einige Module haben interne unsichere Sachen (z.B. raw-Zeiger), die ich brauche, um die öffentlichkeit auf die verschiedenen Module, aber ich will nicht zu entlarven, um Benutzer von my-Kiste. Wie kann ich das tun?
Die einzige Möglichkeit, die mir einfällt, ist, um tatsächlich haben meine Kiste nur einem großen Modul, aber dann gibt es keinen Weg, um es zu teilen in verschiedene Dateien, andere als diese Lösung die scheint ein bisschen hacky.
Normalerweise, wenn ich gegen ein reales problem, dass die einfachen Beispiele in den Rost docs nicht ausreichend erklären, ich kopiere einfach ein beliebtes realen Welt-Kiste, z.B. git2-rs, aber das scheint nur effektiv machen alles öffentlich, einschließlich der raw-Pointer.
InformationsquelleAutor Timmmm | 2017-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Damit eine Artikel exportiert werden aus einer Bibliothek, die Kiste, es muss mindestens ein Pfad führt in die jeder Komponente ist öffentlich. Dies bedeutet, dass alles, was Sie brauchen, um ein Element öffentlichkeit in Ihrer Kiste, aber nicht exportiert aus der Kiste (ich nenne diese "interne" von nun an, zu imitieren, C# - Terminologie) ist, um es in ein eigenes Modul unter der Kiste root.
Jedoch, die Lösung ist ziemlich restriktiv. Was ist, wenn Sie möchten, ein Modul zu haben, mit exportierten Funktionen und internen Funktionen? Um zu exportieren einige Funktionen, die wir benötigen, um das Modul auf öffentlich, und bedeuten, dass alle öffentlichen Elemente in diesem Modul werden exportiert.
Seit Rost 1.18, es ist eine angepasste Lösung, um diese Art von Szenario:
pub(eingeschränkte)
. Mit dieser Funktion können Sie festlegen, "wie öffentlich" ein Element sein sollte. Die syntax ist ziemlich flexibel (Sie können ein Element sichtbar zu einem bestimmten Modul, Baum, anstatt die ganze Kiste), aber wenn Sie wollen, um es einfach zu halten,pub(crate)
wird ein Element überall zugänglich innerhalb der Kiste, aber nicht zu anderen Kisten (entsprichtinternal
in C#).Zum Beispiel, nehmen wir an, wir möchten ein Modul
util
in diefoo
wird exportiert (alsmycrate::util::foo
),bar
ist die interne undbaz
ist privat für das Modul. Der code könnte wie folgt Aussehen:Wenn Sie fest sind auf pre-1.18 Rost, es ist ein workaround, aber es ist ein bisschen umständlich. Es beinhaltet die Definition aller Ihrer Elemente im private-Module, und reexporting nur diejenigen, die Sie wollen öffentlich zu machen (mit
pub use
) in öffentlichen Modulen, die nur reexporte enthalten. Hier ist, was das obige Beispiel würde wie folgt Aussehen:Nicht nur ist dieses nicht einfach zu Lesen und zu verstehen, es doesn ' T decken alle Situationen, in denen
pub
verwendet werden kann. Zum Beispiel, wie würden Sie einige Felder aus einer exportierten Struktur zugänglich, die in anderen Modulen in der gleichen Kiste, ohne auch Sie zu exportieren? Die einzige Möglichkeit wäre, setzen Sie einen wrapper mit einem einzigen privaten Feld, dessen Typ der struct, die mit öffentlichen Felder, das funktioniert gut, wenn Sie wollen, blenden Sie alle Felder aus anderen Kisten, aber nicht, wenn Sie wollen, setzen einige Felder und machen einige andere Felder intern in der gleichen Struktur.Fantastische Antwort, danke!
InformationsquelleAutor Francis Gagné