2015-11-19 14 views
5

Bearbeitet diese Frage, um klarer zu sein, siehe Kommentare unten für die Erklärung.Scala Top-Level-Paket Objekt

So scheint das für mich irgendwie offensichtlich, aber es scheint nicht so funktioniert es, aber wenn ich ein scala-Paket-Objekt habe und es ist in der obersten Ebene meiner Pakete. Sprich wie com.company und es ist etwas Einfaches wie unten

package com 

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

Nun wäre es mir scheinen, dass dieser Variable würde rieseln und zugänglich sein von ihm untergeordneten Pakete sind, aber sie sind es nicht.

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

import com.company._ 

object Model extends App { 
    println(something) 
} 

Dies scheint nur mit dem Import zu arbeiten, was in Ordnung ist, aber ich war mit dem Paket Objekt der Hoffnung, ich Top-Level Dinge für das gesamte Paket definieren könnte und es hat rieseln, aber ist das nicht der Fall ? Gibt es einen Weg dafür? Ich schätze jeden Einblick in diese Sache.

+1

Welche Scala-Version verwenden Sie? Ich konnte 'com.company.Model' auf' 2.11.7' ohne Import kompilieren – Odomontois

+2

Das funktioniert bei mir (ohne 'import'), wie erwartet ... –

+0

Naja ich bin eigentlich eine andere Schicht runter, also ist mein Paket Objekt bei 'com.company', aber mein tatsächlicher Code ist etwas wie' com.company.model.ClassFile' und das funktioniert nicht. Lass es mich nochmal versuchen und stelle sicher, dass ich nicht verrückt bin. –

Antwort

3

Der Code in Ihrer Frage funktioniert so, wie es ohne Import ist. Wenn Sie die Definitionen aller Paketobjekte über die aktuelle Paket rieseln wollen, müssen Sie das Paket Erklärung der Klassen in Subpackages

Paket Objekt

package com 

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

Klasse in einer subpackage com.company ändern müssen .model

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

object Model extends App { 
    println(something) 
} 

Diese Technik wird häufig in der Scala-Bibliothek selbst verwendet. Siehe zum Beispiel die Paketanweisung in s.c.i.HashSet:

package scala 
package collection 
package immutable 
+0

Interessant und nicht, wie ich das erwarten würde, aber es ist gut zu wissen, dass es möglich ist! Gibt es einen Einblick, warum es auf diese Weise umgesetzt wird? –

+2

Es ist vollständig erklärt unter http://www.scala-lang.org/docu/files/package-clauses/packageclauses_0.html –

Verwandte Themen