2012-06-30 15 views
12

Un tipo di auto si presenta come il seguente esempio:Qual è la ragione alla base di `=>` in un self type?

trait A { self: String => } 

Questo dice, quel tratto A (o un sottotipo di esso) deve ereditare la classe String.

La parola self è seguito da : analogico ad una variabile in var s: String, in cui il tipo viene dopo :.

Ma in cosa consiste lo stato => in un self-type? Qual è la ragione di questo?

+1

È un po 'strano di sintassi, penso poiché sembra una freccia che punta a qualcosa ... – david

+0

Sì, all'inizio dell'apprendimento di Scala, ho sempre pensato che la freccia indicasse il resto del corpo , sembrava una funzione e mi confondeva molto. –

risposta

11

Provate a indovinare il lavoro ... È necessario delimitatore specifico della dichiarazione del tipo di auto. Immagina che lo => sia stato semplicemente omesso. this: String sarebbe un'istruzione sintatticamente valida (anche se il correttore di tipi si lamenterà).

Quindi quale dovrebbe essere il delimitatore? Non vorrai parentesi graffe nidificate come trait A { self: String { ... }}. Quindi quali delimitatori esistenti non abbinati esistono? => è l'unico a cui riesco a pensare.

Dove si trova => utilizzato altrove? Come zucchero per i tipi di funzione (A => B) e per i corpi delle funzioni (i: Int => i + 1). Anche per argomenti call-by-name e per i casi di una corrispondenza di modello. Quest'ultimo utilizzo è in qualche modo coerente con il self-type. È come corrispondere a this per essere di un tipo particolare e quindi definire il corpo in base a questa "corrispondenza". Non lo so, forse questa è un'analogia sciocca.

+0

Grazie per aver condiviso le tue opinioni su questo argomento. Per me va bene. Ho pensato in una direzione simile. –

9

Nota che self non è una parola chiave, ma un identificatore normale. È possibile scrivere qualsiasi altro identificatore valido al posto di self. E : dopo un'espressione è un di tipo, qualcosa interamente valido ovunque un'espressione è valida.

Il => è ciò che indica a Scala che esiste un tipo di auto. Altrimenti, self: Type sembra una semplice dichiarazione, un'espressione. Per esempio:

class A 
class B extends A { 
    this: A 
} 

Questo è codice Scala valida, e non avere un tipo di auto.

+0

Buon punto, grazie. Esiste una ragione concreta per usare il simbolo '=> 'come simbolo per un self-type o è appena preso, perché si adatta bene al resto della sintassi Scalas? –

+0

@JohnThreepwood Odersky è contrario ai simboli riservati e alle parole chiave, quindi cerca di riutilizzare quelli che ha. Penso che si sia spinto troppo oltre quando si tratta di underscore, ma è così. –

0

this è all'interno del corpo di una classe, quindi in questo senso è un parametro (anche se non lo pensiamo mai in questo modo). La sintassi self-type lo rende semplicemente esplicito e consente di assegnargli un nome e un tipo diversi. Quindi la freccia diventa un'ottima scelta come separatore tra il raccoglitore e il suo scopo.

Problemi correlati