Nimチュートリアル【十二】

3305 ワード

指定シンボルを除外
一般的にimport文を使用すると、1つのモジュール内のシンボルがインポートされます.
特定の記号を除外するような場合(一部の記号をインポートしたくない場合)
EXcept句を使用できます
次のように
import mymodule except y

この行のコードはmymoduleモジュールのy記号を排除し、他の記号はインポートされました.
より多くの記号を除外するには、カンマで分割します.
 
指定記号のインポート
from文を使用して指定したシンボルをインポートすることもできます
次のコードを見てください.
from mymodule import x, y, z

上のコードではmymoduleモジュールのx,y,zの3つのシンボルのみがインポートされています
 
強制ネームスペースの制限
まず次のコードを見てみましょう
from mymodule import x, y, z

x()           # use x without any qualification

上のコードでは、
現在のモジュールがxを使用する場合は何の制限もなく、そのまま使用すればよい.
現在のモジュールで定義されているように
しかし、開発者は名前空間を持って一緒に使用することを望んでいます.
fromキーワードとnilキーワードを組み合わせることで、このような制限を実現することができます.
次のコードを見てみましょう
from mymodule import nil

mymodule.x()  # must qualify x with the module name as prefix

x()           # using x here without qualification is a compile error

モジュール名が長い場合があります
またネームスペース限定を使う場合
大きなトラブルをもたらします
この場合、モジュール名に別名を付けることができます.
次のコードを見てください.
from mymodule as m import nil

m.x()         # m is aliasing mymodule

このようなコードを押すと、短いモジュール別名を名前空間として使用できます.
 
include文
include文とfrom文には本質的な違いがある
include文はコンパイル中にいくつかのファイルを1つのファイルにマージします
これは大きなファイルをいくつかのファイルに分割するのに役立ちます.
include fileA, fileB, fileC

 
オブジェクト
Nimでは、オブジェクトはメタグループに似ています
オブジェクトも一連の異なるものを一緒に置く方法です
オブジェクトが多くのメタグループにない機能を提供する場合
オブジェクトは継承と情報非表示を提供します
オブジェクトのカプセル化プロパティのため、オブジェクトの構造方法はオブジェクトの内部にのみ使用できます.
(オブジェクトはオブジェクトを初期化する方法を提供する必要があります.これがコンストラクタです).
実行中にオブジェクトインスタンスのタイプにアクセスしたい場合は
次のコードなど、ofオペレータを使用できます.
type
  Person = ref object of RootObj
    name*: string  # the * means that `name` is accessible from other modules
    age: int       # no * means that the field is hidden from other modules
  
  Student = ref object of Person # Student inherits from Person
    id: int                      # with an id field

var
  student: Student
  person: Person
assert(student of Student) # is true
# object construction:
student = Student(name: "Anton", age: 5, id: 2)
echo student[]

*とマークされた属性は外部からアクセスできます.
オブジェクトのタイプはtypeでのみ定義できます
Nimのオブジェクトは継承をサポートしていますが、マルチ継承はサポートされていません.後でマルチ継承をサポートするかもしれません.
オブジェクトに適切な祖先がいなければ
彼の祖先としてRootObjを使うことができます
1つのオブジェクトタイプに祖先がいなくても、
しかし、祖先がいなければ、彼にも子孫がいない.
Inheritableを使用して、RootObj以外の子孫オブジェクトを生成できます.
(NimのGTKバッグはこんな感じ)
refキーワードを使用して継承関係を明確にする
注意:設計上の組み合わせは継承より優れていることが多い
 
自己参照オブジェクトタイプ
オブジェクト、メタグループは、かなり複雑なタイプ(データ構造)を作成できます.
たとえば、自己参照タイプ
次のコードを参照してください.
type
  Node = ref NodeObj # a traced reference to a NodeObj
  NodeObj = object
    le, ri: Node     # left and right subtrees
    sym: ref Sym     # leaves contain a reference to a Sym
  
  Sym = object       # a symbol
    name: string     # the symbol's name
    line: int        # the line the symbol was declared in
    code: PNode      # the symbol's abstract syntax tree

 
 
さて、今日はここまでにしますが、お好きな方はおすすめをお願いします