2016-04-07 6 views
5

Il tratto Default può essere #[derive(..)] d solo se il contenuto del tipo derivante implementa anche Default. Ciò significa che il tratto diventa più facile da usare e più è implementato. Tuttavia, noto che alcuni tipi di std mancano di implementazioni, sebbene abbiano valori di default perfettamente validi (a volte dipendono da parametri generici).Perché il valore predefinito non è implementato per Mutex, RWLock, CondVar, Duration?

  • Mutex<T> e RWLock<T> potrebbe attuare da new(_) (where T: Default)
  • CondVar potrebbe semplicemente attuare da CondVar::new()
  • Duration potrebbe derivare (per ottenere una durata nulla, che è un valore predefinito ragionevole)

Esiste un motivo tecnico per tali omissioni?

+0

Non sarei d'accordo con * una durata zero, che è un predefinito ragionevole *, ma gli altri, certo. – Shepmaster

+0

Perché? Pensi che non ci sia alcun difetto ragionevole o pensi che ce ne sia uno più ragionevole? – llogiq

+0

Direi che non esiste un default sensato. La maggior parte delle volte penso alla durata per quanto riguarda i timeout, e un timeout di zero non ha senso per me e nessuno dei due sceglierà nessun altro valore. Anche se vedo che i numeri implementano 'Default' come' 0', quindi ¯ \\ _ (ツ) _/¯. – Shepmaster

risposta

1

Alcune persone hanno posto una domanda simile con le implementazioni Debug, vedere “Missing Debug Implementations — #31869” che può anche essere derivato solo in condizioni simili a Default.

Sfortunatamente la corrispondente PR "libcore: add Debug implementations to most missing types #32054" sembra suggerire che alcuni tipi non erano Debug semplicemente perché nessuno aveva scritto un'implementazione Debug per loro. Alcuni altri tipi sono controversi su cosa dovrebbe fare l'implementazione e c'è qualche timore di aggiungerli nella libreria standard.

È ragionevole supporre che almeno alcuni tipi non siano Default per gli stessi motivi non tecnici.

+0

C'è il numero 31865 (almeno per CondVar, ho fatto una nota degli altri). Ho spinto [PR # 32807] (https://github.com/rust-lang/rust/pull/32807) – llogiq