zoukankan      html  css  js  c++  java
  • Nim教程【十二】

    排除指定符号

    一般情况下使用import语句,会把一个模块内的符号都导入进来

    如果你像排除特定的符号(不想让某些符号被导入进来)

    可以使用except子句

    就像下面这样

    import mymodule except y

    这行代码排除了mymodule模块中的y符号,其他符号都导入了

    如果想排除更多的符号,可以使用逗号分割

    导入指定符号

    我们还可以使用from语句来导入指定的符号

    请看下面的代码:

    from mymodule import x, y, z

    上面的代码中,只导入了mymodule模块的x,y,z三个符号

    强行名称空间限定

    先来看看下面的代码

    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语句在编译期把几个文件合并成一个文件

    这有利于把一个大的文件分割成几个文件

    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作为作为他的祖先

    一个对象类型可以没有祖先,

    但如果没有祖先的话,那么他同样也不能有子孙

    可以使用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

    好了,今天就写到这里,喜欢的朋友请帮忙点个推荐

  • 相关阅读:
    TeamViewer的替代品:realVNC
    Introduction of Generator in Python
    Excel: assign label to scatter chart using specific cell values
    reverse/inverse a mapping but with multiple values for each key
    虚拟化与云计算
    现代计算机简介
    CentOS 7 安装中网络设置111
    机械硬盘原理
    文件系统
    最重要的块设备——硬盘
  • 原文地址:https://www.cnblogs.com/liulun/p/4582465.html
Copyright © 2011-2022 走看看