当前位置: 首页 > news >正文

Nim教程【十一】

引用类型和指针类型

不同的引用可以只想和修改相同的内存单元

在nim中有两种引用方式,一种是追踪引用,另一种是非追踪引用

非追踪引用也就是指针,指向手动在内存中分配的对象;

追踪引用指向一个垃圾收集的对象;

非追踪引用是不安全的

然而对于一些低级操作(比如说访问硬件),非追踪引用是不可避免的

追踪引用用ref关键词声明

非追踪引用用ptr关键词声明

可以用[]来解包一个引用(访问一个元组或对象域时要用到)

请看下面的代码:

type
  Node = ref NodeObj
  NodeObj = object
    le, ri: Node
    data: int
var
  n: Node
new(n)
n.data = 9
# no need to write n[].data; in fact n[].data is highly discouraged!

上面代码中最后一行,没必要写成n[].data

使用new()来创建一个新的追踪对象

可以使用alloc或dealloc或realloc函数处理非追踪对象

如果一个引用没有指向任何东西,那么他的值为nil

proc方法指针类型

方法类型是一个方法的指针

(译注:一般函数式的语言中都有这个特性哦)

方法类型的变量默认值为nil

来看一下下面的代码

proc echoItem(x: int) = echo(x)

proc forEach(action: proc (x: int)) =
  const
    data = [2, 3, 5, 7, 11]
  for d in items(data):
    action(d)

forEach(echoItem)

模块

nim允许把一个程序分成若干个模块

一个模块就是一个文件

模块可以起到隐藏信息的作用(译注:面向对象的封装)

模块可以起到分开编译的作用

一个模块可以用import语句导入另一个模块的符号

在一个模块中,只有用星号标记的符号,才能导出给另一个模块

来看看下面的代码:

# Module A
var
  x*, y: int

proc `*` *(a, b: seq[int]): seq[int] =
  # allocate a new sequence:
  newSeq(result, len(a))
  # multiply two int sequences:
  for i in 0..len(a)-1: result[i] = a[i] * b[i]

when isMainModule:
  # test the new ``*`` operator for sequences:
  assert(@[1, 2, 3] * @[1, 2, 3] == @[1, 4, 9])

在这个模块文件中导出了变量x和方法*

在程序开始执行的时候就会执行模块的顶层语句,

程序员可以利用nim的这个特性来初始化一些复杂的数据结构

模块的内部可以通过使用isMainModule内置变量来判断当前模块是否为主模块

来看看下面两个模块的代码:

# Module A
type
  T1* = int  # Module A exports the type ``T1``
import B     # the compiler starts parsing B

proc main() =
  var i = p(3) # works because B has been parsed completely here

main() # Module B
import A  # A is not parsed here! Only the already known symbols
          # of A are imported.

proc p*(x: A.T1): A.T1 =
  # this works because the compiler has already
  # added T1 to A's interface symbol table
  result = x + 1

模块的符号的书写要符合module.symbol的语法

如果一个符号在两个模块中都定义过了

而且第三个模块引用了这两个模块

来看看下面三个模块的代码:

# Module A
var x*: string
# Module B
var x*: int# Module C
import A, B
write(stdout, x) # error: x is ambiguous
write(stdout, A.x) # no error: qualifier used

var x = 4
write(stdout, x) # not ambiguous: uses the module C's x

但这个规则并不适用于方法或迭代器

对于方法或迭代器来说,适用于重载的规则

来看看下面的代码:

# Module A
proc x*(a: int): string = $a# Module B
proc x*(a: string): string = $a# Module C
import A, B
write(stdout, x(3))   # no error: A.x is called
write(stdout, x(""))  # no error: B.x is called

proc x*(a: int): string = nil
write(stdout, x(3))   # ambiguous: which `x` is to call?

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 表达式 - PHP手册笔记
  • winzip15.0许可证
  • 云平台现有问题
  • 基于一个公网ip实现多主机上网
  • ffmpeg中swscale 的用法
  • 【吾日三省吾身】2015.6.20-涅槃行动第三十三天
  • Python套接字编程(1)——socket模块与套接字编程
  • 详解java Final关键字
  • pthread_t定义结构
  • 魔方阵
  • 写给努力坚持自学LINUX的自己
  • 如何开机就启动node.js程序
  • Atlas+Keepalived系列二:管理Atlas
  • mongodb 基础操作(一)
  • 进程和计划任务管理
  • [deviceone开发]-do_Webview的基本示例
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • ES6 ...操作符
  • js如何打印object对象
  • Linux快速复制或删除大量小文件
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Netty 4.1 源代码学习:线程模型
  • Node 版本管理
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 初识MongoDB分片
  • 从零开始在ubuntu上搭建node开发环境
  • 分布式熔断降级平台aegis
  • 分享几个不错的工具
  • 如何编写一个可升级的智能合约
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 思否第一天
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 源码安装memcached和php memcache扩展
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #if 1...#endif
  • $GOPATH/go.mod exists but should not goland
  • %check_box% in rails :coditions={:has_many , :through}
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (ibm)Java 语言的 XPath API
  • (poj1.2.1)1970(筛选法模拟)
  • (补充)IDEA项目结构
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • ***原理与防范
  • .bat批处理(一):@echo off
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net的DataSet直接与SQL2005交互
  • .net知识和学习方法系列(二十一)CLR-枚举
  • @JsonSerialize注解的使用