2015-07-22 23 views
5

Così ho recentemente iniziato a sperimentare con Kotlin ed io siamo capitati questo:modificatore di visibilità privata e sottopackage

If a top-level declaration is marked private, it is private to the package it’s declared in (see Visibility Modifiers). Since packages really nest in Kotlin, i.e. package foo.bar is considered a member of foo, if something is private in a package, it is visible to all its subpackages.

Note that members of outer packages are not imported by default, i.e. in a file in package foo.bar we can’t access members of foo without importing them. From: Visibility and Package Nesting

Quindi prendiamo in considerazione il seguente esempio:

File1.kt

package foo 

private fun bar() = println("This is bar!!!") 

e File2.kt

package foo.baz 

import foo.bar 

fun main(args: Array<String>) = bar() 

Da quello che ho capito la funzione bar() dovrebbe essere visibile nel pacchetto foo.baz e quindi essere richiamabile da main(). Ma quando provo a compilare quanto sopra ottengo il seguente messaggio di errore:

Errore: Kotlin: non possono accedere a 'bar': si tratta di 'private' in 'foo'

È questo un bug o ha le specifiche della lingua sono state aggiornate e la documentazione no? Mi sto perdendo qualcosa?

Grazie in anticipo.

risposta

6

Abbiamo modificato le regole di visibilità di recente, in modo che i pacchetti non nidificano più. Quindi questo non è un bug nel compilatore, ma nei documenti

+0

Grazie, ma ricordarsi di documentare tali modifiche. Quindi, come funzionano ora i modificatori di visibilità del pacchetto/livello superiore? – feugatos

+0

I pacchetti non si annidano, cioè privato in un pacchetto non è visibile in un altro. –

+1

Inoltre, 'private' sarà presto cambiato per essere visibile non in un pacchetto ma nel file è dichiarato –

-1

Mentre potrebbe essere come ha scritto Andrey Breslav, che le regole sono cambiate, puoi ancora usare il tuo codice anche con la versione 0.12.1218 e 0.12.200.

Poiché le regole sono state modificate, non è necessario farlo, ma se si desidera veramente farlo, è sufficiente modificare l'istruzione di importazione in: import foo.* invece di importare esplicitamente la barra.

+1

Ma perché è permesso? Dovrebbe importare foo. * escludere anche i membri privati? Dopotutto non posso importare esplicitamente foo.bar. – feugatos

+0

Non ne ho idea, l'ho appena scoperto per coincidenza mentre giocavo con il tuo codice. La mia ipotesi è che l'hanno bloccata a livello di codice, invece di rimuovere completamente la funzione, e non copriva quella globa. – Onizuka89

Problemi correlati