Spec2.8Chap9a

第 9 章 トップレベル定義 (Top-Level Definitions)



9.1 コンパイル単位 (Compilation Units)

構文:

   CompilationUnit   ::=   {'package' QualId semi} TopStatSeq
   TopStatSeq        ::=   TopStat {semi TopStat}
   TopStat           ::=   {Annotation} {Modifier} TmplDef
                       |   Import
                       |   Packaging
                       |   PackageObject
                       |
   QualId            ::=   id {'.' id}

A compilation unit consists of a sequence of packagings, import clauses, and class and object definitions, which may be preceded by a package clause .

コンパイル単位は、パッケージング、インポート節、クラスとオブジェクト定義、 等の並びからなり、先行してパッケージ節があっても構いません。

次の、1 つ以上のパッケージ節で始まるコンパイル単位

   package p1 ;
   ...
   package pn ;
   stats

starting with one or more package clauses is equivalent to a compilation unit consisting of the packaging

は、次のパッケージングからなるコンパイル単位に等価です。

   package p1 { ...
     package pn {
         stats
       } ...
   }

Implicitly imported into every compilation unit are, in that order : the package java.lang, the package scala, and the object scala.Predef (§12.5). Members of a later import in that order hide members of an earlier import .

すべてのコンパイル単位中に暗黙のうちにインポートされるものは、順に、 パッケージ java.lang、パッケージ scala とオブジェクト scala.Predef (§12.5) です。 この順番の中で、後でインポートしたメンバーは、 前にインポートしたメンバーを隠します。



9.2 パッケージング (Packagings)

構文:

   Packaging        ::=   'package' QualId [nl] '{' TopStatSeq '}'

A package is a special object which defines a set of member classes, objects and packages . Unlike other objects, packages are not introduced by a definition . Instead , the set of members of a package is determined by packagings .

パッケージはメンバークラス、 オブジェクトとパッケージの集合を定義する特別なオブジェクトです。 他のオブジェクトと異なり、パッケージは定義では導入されません。 その代わりに、パッケージのメンバーの集合は、パッケージングによって決定されます。

A packaging package p { ds } injects all definitions in ds as members into the package whose qualified name is p . Members of a package are called top-level definitions . If a definition in ds is labeled private, it is visible only for other members in the package .

パッケージング package p { ds } は、 ds 中のすべての定義をその限定修飾された名前が p であるパッケージに、 メンバーとして注入します。 パッケージのメンバーは トップレベル 定義と呼ばれます。 もし ds 中の定義が private と印されていれば、 そのパッケージ中の他のメンバーからのみ可視となります。

Inside the packaging, all members of package p are visible under their simple names . However this rule does not extend to members of enclosing packages of p that are designated by a prefix of the path p .

パッケージング内では、パッケージ p のすべてのメンバーについて、 それらの単純名が可視となります。 しかし、この規則は、パス p の前置子によって指定される、 p が取り囲むパッケージのメンバーには拡張されません。


Example 9.2.1 次のパッケージングが与えられているとします。

   package org.net.prj {
     ...
   }

all members of package org.net.prj are visible under their simple names, but members of packages org or org.net require explicit qualification or imports .

パッケージ org.net.prj のすべてのメンバーは、その単純名が可視です。 しかしパッケージ org あるいは org.net のメンバーは、 明示的な限定修飾あるいはインポートを必要とします。

Selections p.m from p as well as imports from p work as for objects . However, unlike other objects, packages may not be used as values . It is illegal to have a package with the same fully qualified name as a module or a class .

p からの選択 p.m は、p からのインポートと同様、 オブジェクトについてうまく機能します。 しかし、他のオブジェクトと異なり、パッケージは値として使用できません。 モジュールあるいはクラスと完全修飾された同じ名前のパッケージは不正です。

Top-level definitions outside a packaging are assumed to be injected into a special empty package . That package cannot be named and therefore cannot be imported . However, members of the empty package are visible to each other without qualification .

パッケージング外でのトップレベル定義は、 特別な空パッケージに注入されるとみなされます。 このパッケージは、名前を付けることはできず、したがってインポートできません。 しかし、空パッケージのメンバーは互いに限定修飾なしで可視です。



9.3 パッケージオブジェクト (Package Objects)

構文:

   PackageObject ::=   'package' 'object' ObjectDef

A package object package object p extends t adds the members of template t to the package p . There can be only one package object per package . The standard naming convention is to place the definition above in a file named package.scala that's located in the directory corresponding to package p .

パッケージオブジェクト package object p extends t は、 テンプレート t のメンバーをパッケージ p に加えます。 パッケージ毎に、ただ 1 つのパッケージオブジェクトが可能です。 標準的な命名規則では、上記の定義を、 パッケージ p に直接対応するディレクトリ中の package.scala という名前のファイルに置きます。

The package object should not define a member with the same name as one of the top-level objects or classes defined in package p . If there is a name conflict, the behavior of the program is currently undefined . It is expected that this restriction will be lifted in a future version of Scala .

パッケージオブジェクトは、パッケージ p 中で定義されたトップレベルオブジェクト あるいはクラスの 1 つと同じ名前のメンバーを定義すべきではありません。 名前の衝突がある場合、プログラムの振る舞いは現在未定義です。 この制限は Scala の将来のバージョンで取り上げられることが期待されます。



9.4 パッケージ参照 (Package References)

構文:

   QualId               ::=   id {'.' id}

A reference to a package takes the form of a qualified identifier . Like all other references , package references are relative . That is, a package reference starting in a name p will be looked up in the closest enclosing scope that defines a member named p .

The special predefined name _root_ refers to the outermost root package which contains all top-level packages .

パッケージへの参照は、限定修飾された識別子の形をとります。 他のすべての参照と同じように、パッケージ参照は相対的です。 すなわち、名前 p で始まるパッケージ参照は、 名前 p のメンバーを定義する、最も近く取り囲むスコープが検索されます。

事前定義された特別な名前 _root_ は、すべてのトップレベルのパッケージを含む、 最も外側のルートパッケージを参照します。


Example 9.4.1 次のプログラムを考えます。:

   package b {
     class B
   }
   
   package a.b {
     class A {
       val x = new _root_.b.B
     }
   }

Here, the reference _root_.b.B refers to class B in the toplevel package b . If the _root_ prefix had been omitted, the name b would instead resolve to the package a.b, and, provided that package does not also contain a class B, a compiler-time error would result .

ここで、参照 _root_.b.B は、トップレベルパッケージ b 中のクラス B を参照します。 もし _root_ 前置子が省略されたなら、名前 b は代わりに、パッケージ a.b へ変換されます。そしてそのパッケージもクラス B を含まないなら、 コンパイルエラーとなります。



9.5 プログラム (Programs)

A program is a top-level object that has a member method main of type (Array[String])Unit . Programs can be executed from a command shell. The program's command arguments are are passed to the main method as a parameter of type Array[String] .

プログラム は、型 (Array[String])Unit のメンバーメソッド main を持つトップレベルのオブジェクトです。 プログラムはコマンドシェルから実行できます。 プログラムのコマンド引数は、型 Array[String] のパラメータとして main メソッドへ渡されます。

The main method of a program can be directly defined in the object, or it can be inherited . The scala library defines a class scala.Application that defines an empty inherited main method . An objects m inheriting from this class is thus a program, which executes the initializaton code of the object m .

プログラムの main メソッドは、オブジェクト中で直接定義するか、あるいは、 それを継承できます。 Scala ライブラリでは、空の継承された main メソッドを定義する、クラス scala.Application を定義しています。 このクラスを継承するオブジェクト m は 1 つのプログラムとなり、 オブジェクト m の 初期化コードを実行します。


Example 9.5.1

The following example will create a hello world program by defining a method main in module test.HelloWorld .

次の例は、モジュール test.HelloWorld の中でメソッド main を定義し、 hello world プログラムを生成します。

 package test
 object HelloWord {
   def main(args: Array[String]) { println("hello world") }
 }

このプログラムはコマンドで起動できます。

   scala test.HelloWorld

Java 環境では、次のコマンド

   java test.HelloWorld

は、同様にうまく働くでしょう。

HelloWorld は main メソッドがなくても、 その代わりに Application を継承することで同様に定義できます。

   package test
   object HelloWord extends Application {
     println("hello world")
   }

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2011年02月28日 15:14
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。