博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
论Nim中的 proc 和 method
阅读量:5133 次
发布时间:2019-06-13

本文共 3147 字,大约阅读时间需要 10 分钟。

Nim中。proc 是定义过程的keyword。method 是定义方法的keyword。它们之间根本的差别是proc定义的过程是静态绑定。method定义的方法是动态绑定。谈到静态绑定、动态绑定又会提到重载、重写和多态等方面的内容,假设对上述的一些概念不太理解。能够看我的。

过程的重载:

例1:

proc print (): void =   echo ("This is empty")proc print (a:int): void =   echo ("int a = ",a)proc print (a:float): void =   echo ("float a = ",a)print()print(1)print(1.0)
Out:This is emptyint a = 1float a = 1.0

方法的重载:

例2:

type  person* = ref object of RootObj    name*:string    age*:intmethod mm(p:person): int =  echo p.age,p.name  echo "method"  return 0method mm(p:person,x:int): int =   echo "methodint  ",x  return 0method mm(p:person,x:float): int =   echo "methodfloat  ",x  return 0var yrs = person(name:"yrs",age:23)discard yrs.mm()discard yrs.mm(3)discard yrs.mm(3.0)
Out:23yrsmethodmethodint  3methodfloat  3.0

proc定义的过程,它的參数没有什么要求,能够没有參数,能够是基本类型,也能够是自定义的类类型。

可是method定义的方法,它的參数必须至少含有一个类类型的的參数。

也就是说method方法的模块里,必须含有类。同一时候该方法的參数至少含有一个类类型的參数。

方法的重写与多态:

例3:

#Module: tProcMethod.nimtype Animal* = ref object of RootObj  name*: string  age*: int  proc SelfIntroduce*(this: Animal): void = echo ("my name is animal")method vocalize*(this: Animal): string = "..."method ageHumanYrs*(this: Animal): int = this.agetype Dog* = ref object of Animalproc SelfIntroduce*(this: Dog): void = echo ("my name is ",this.name)method vocalize*(this: Dog): string = "woof"method ageHumanYrs*(this: Dog): int = this.age * 7type Cat* = ref object of Animalproc SelfIntroduce*(this: Cat): void = echo ("my name is ",this.name)method vocalize*(this: Cat): string = "meow"
#Module:testProcMethod.nimimport tProcMethodvar animals : Animalanimals = Dog(name: "Sparky", age: 10)echo animals.nameecho animals.ageecho animals.vocalize()                 #method方法调用。是通过 实例对象引用.方法名echo animals.ageHumanYrs()tProcMethod.SelfIntroduce(animals)      #这里调用proc过程是用 模块名.过程名,在在Windows下用命令行执行文件时,文件名称(模块名)的全部字母被觉得是小写,                                         #这里调用过程时要注意模块名字母的大写和小写。

在Linux下则区分大写和小写。 animals = Cat(name: "Mitten", age: 10) echo animals.vocalize() echo animals.ageHumanYrs() tProcMethod.SelfIntroduce(animals)

Out:Sparky10woof70my name is animalneow10my name is animal

方法的重载、重写与多态:

例4:

type  Far = ref object of RootObj  bigSon = ref object of Far  smallSon = ref object of Far    x: intmethod collide(x:Far,y:int)  =                      echo "to override!"method collide(x: bigSon, y: int) =  echo "big1"method collide(x: smallSon, y: int) =  echo "small1"method collide(x: bigSon, y: float)  =  echo "2"method collide(x: bigSon, y: bigSon)  =  echo "3"var far: Farvar bigsona, bigsonb: bigSonvar smallsona: smallSonnew farnew bigsonanew bigsonbnew smallsonacollide(far,1)far = bigsonbcollide(far,1) collide(bigsona,1.0) collide(bigsona,bigsonb)far = smallsonacollide(far,1)
Out:to override!big123small1

 

在例4中。第二和第三个collide方法各自是bigSon类的方法和smallSon类的方法,它们都实现了对父类方法的重写。第二、四、五collide方法是bigSon类的方法,它们实现了collide方法的重载。

由上面的两个样例能够看出。Nim中的类和方法的存在与Java和Python是不同的。它没有一个明显的界限去差别哪个方法属于哪个类,可是能够通过方法中类类型来辨别(注意动态绑定时。參数是从左至右查询的)。

这样就大大减少了程序的可读性,就像例4一样。我们能够像例3一样分开定义来添加程序的可读性。

总结:

1、过程是静态绑定。方法是动态绑定。

2、过程和方法都能重载。

3、过程可以被重写。可是不能实现多态效果。

4、方法可以被重写,可以实现多态效果

5、注意方法和类的关系。

转载于:https://www.cnblogs.com/claireyuancy/p/6964342.html

你可能感兴趣的文章
.NET 母版页 讲解
查看>>
Android Bitmap 和 Canvas详解
查看>>
最大权闭合子图
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
导入导出数据库和导入导出数据库表
查看>>
linux下操作mysql
查看>>
【03月04日】A股滚动市盈率PE历史新低排名
查看>>
Xcode5和ObjC新特性
查看>>
jvm slot复用
查看>>
高并发系统数据库设计
查看>>
LibSVM for Python 使用
查看>>
入坑的开始~O(∩_∩)O~
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
Windows 7 上安装Visual Studio 2015 失败解决方案
查看>>
iOS按钮长按
查看>>
Shell流程控制
查看>>
CSS属性值currentColor
查看>>
[Leetcode|SQL] Combine Two Tables
查看>>
《DSP using MATLAB》Problem 7.37
查看>>