2015-11-19 15 views
5

Modificata questa domanda per essere più chiara, vedere i commenti di seguito per la spiegazione.Oggetto pacchetto livello superiore Scala

Quindi questo mi sembra abbastanza ovvio, ma non sembra che funzioni in questo modo, ma se ho un oggetto pacchetto scala ed è nel livello più alto dei miei pacchetti. Dire come com.company ed è qualcosa di semplice come di seguito

package com 

package object company{ 
    val something = "Hello world." 
} 

Ora mi sembra che questa variabile sarebbe trickle down ed essere accessibile da esso è pacchetti figlio, ma non lo sono.

// 2 Layers down instead of the direct child 
package com.company.app 

import com.company._ 

object Model extends App { 
    println(something) 
} 

Questo sembra funzionare solo con l'importazione, che va bene, ma speravo con l'oggetto del pacchetto potrei definire le cose di alto livello per l'intero pacchetto e lo hanno trickle down, ma è che non è il caso ? C'è un modo per farlo funzionare? Apprezzo qualsiasi idea in merito.

+1

Quale versione di scala stai usando? Sono stato in grado di compilare 'com.company.Model' su' 2.11.7' senza importare – Odomontois

+2

Questo funziona per me (senza 'import'), come previsto ... –

+0

Beh, in realtà sono un altro livello in basso, quindi il mio oggetto pacchetto è in 'com.company' ma il mio codice attuale è simile a' com.company.model.ClassFile' e non funziona. Lasciami riprovare e assicurati di non essere pazzo. –

risposta

3

Il codice inserito nella tua domanda funziona così com'è senza un'importazione. Se si desidera che le definizioni di tutti gli oggetti di pacchetto sopra il pacchetto corrente a gocciolare verso il basso, si dovrà modificare l'istruzione package delle classi in sottopackage

oggetto pacchetto

package com 

package object company { 
    val something = "Hello world." 
} 

Classe in un com.company sottopackage .model

package com 
package company 
package model 
// package com.company.model would not work here! 

object Model extends App { 
    println(something) 
} 

Questa tecnica è utilizzata frequentemente nella scala libreria stessa. Si veda ad esempio l'estratto conto in s.c.i.HashSet:

package scala 
package collection 
package immutable 
+0

Interessante e non come mi aspetterei che sia fatto, ma è bello sapere che è possibile! C'è qualche idea sul perché è implementato in questo modo? –

+2

È completamente spiegato a http://www.scala-lang.org/docu/files/package-clauses/packageclauses_0.html –

Problemi correlati