在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 empty
int a = 1
float a = 1.0

方法的重载:

例2:

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

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

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

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

方法的重写与多态:

例3:

#Module: tProcMethod.nim
type 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.age type Dog* = ref object of Animal
proc SelfIntroduce*(this: Dog): void = echo ("my name is ",this.name)
method vocalize*(this: Dog): string = "woof"
method ageHumanYrs*(this: Dog): int = this.age * 7 type Cat* = ref object of Animal
proc SelfIntroduce*(this: Cat): void = echo ("my name is ",this.name)
method vocalize*(this: Cat): string = "meow"
#Module:testProcMethod.nim
import tProcMethod
var animals : Animal
animals = Dog(name: "Sparky", age: 10)
echo animals.name
echo animals.age
echo 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:
Sparky
10
woof
70
my name is animal
neow
10
my name is animal

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

例4:

type
Far = ref object of RootObj
bigSon = ref object of Far
smallSon = ref object of Far
x: int method 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: Far
var bigsona, bigsonb: bigSon
var smallsona: smallSon new far
new bigsona
new bigsonb
new smallsona collide(far,1) far = bigsonb
collide(far,1)
collide(bigsona,1.0)
collide(bigsona,bigsonb) far = smallsona
collide(far,1)
Out:
to override!
big1
2
3
small1


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

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

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

总结:

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

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

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

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

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

论Nim中的 proc 和 method的更多相关文章

  1. Ruby中Block, Proc, 和Lambda

    Block Blocks就是存放一些可以被执行的代码的块,通常用do...end 或者 {}表示 例如: [1, 2, 3].each do |num| puts num end [1, 2, 3]. ...

  2. 2.C#中泛型在方法Method上的实现

    阅读目录   一:C#中泛型在方法Method上的实现 把Persion类型序列化为XML格式的字符串,把Book类型序列化为XML格式的字符串,但是只写一份代码,而不是public static s ...

  3. java中什么是bridge method(桥接方法)

    java中什么是bridge method(桥接方法) https://blog.csdn.net/z69183787/article/details/81115524

  4. vue.js 中 data, prop, computed, method,watch 介绍

    vue.js 中 data, prop, computed, method,watch 介绍 data, prop, computed, method 的区别 类型 加载顺序 加载时间 写法 作用 备 ...

  5. ruby中Block, Proc 和 Lambda 浅析

    Block 与Proc的区别: Block是代码块,Proc是对象: 参数列表中最多只能有一个Block, 但是可以有多个Proc或Lambda; Block可以看成是Proc的一个类实例. Proc ...

  6. 你真的了解PeopleSoft中的function和method方法嘛

    谈下function和method在内嵌与外部传参的区别 1.内嵌函数(Internal Functions) 看下现在输出&x的话会返回什么值? 2.内嵌函数(Internal Functi ...

  7. Linux中目录proc/net/dev详解【转】

    转自:https://blog.csdn.net/yzy1103203312/article/details/77848192 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  8. 【java编程】java中什么是bridge method(桥接方法)

    https://blog.csdn.net/mhmyqn/article/details/47342577 https://www.cnblogs.com/strinkbug/p/5019453.ht ...

  9. Linux中通过/proc/stat等文件计算Cpu使用率

    Linux平台Cpu使用率的计算 proc文件系统 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/pro ...

随机推荐

  1. EntityFramework学习笔记1--安装

    1.新建项目 2.工具=>NuGet程序包管理器=>程序包管理控制器 3.PM> Install-Package EntityFramework 安装EF

  2. jqueryValidator自定义校验规则的一种方式(覆盖源码)

    1.自定义js文件:jqValid-extend.js 内容: function setDefaultValidate(){ $.extend(true, $.validator, { // 方法 m ...

  3. angular.js高级程序设计书本开头配置环境出错,谁能给解答一下

    server.jsvar connect=require('connect');serveStatic=require('serve-static');var app=connect();app.us ...

  4. MVC中几种常用的ActionResult

    一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等 ...

  5. Python的matplotlib库画图不能显示中文问题解决

    有两种解决办法: 一种是在代码里设置为能显示中文的字体,如微软雅黑(msyh.ttf)和黑体(simsun.ttc) 如下在要画图的代码前添加: import matplotlib.pyplot as ...

  6. 把ISO文件当作光盘挂载

    当不能挂载光盘或者U盘时候,只需要把ISO文件传到某个目录中,比如/data下,即可挂载,如下所示:   mount -o loop /data/rhel-server-6.3-x86_64-dvd. ...

  7. 俩层判断,判断button是否可以点击

    描述如下: 当被保人数超过三个人并且input是必填项的时候button是disable为false的 代码如下: //起保日期 $('.pickerfour').on('tap', function ...

  8. ES6学习笔记(十一)Object的继承者Reflect

    1.概述 Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API.Reflect对象的设计目的有这样几个. (1) 将Object对象的一些明显属于语言内部的方法(比如O ...

  9. 记intel杯比赛中各种bug与debug【其二】:intel caffe的使用和大坑

    放弃使用pytorch,学习caffe 本文仅记录个人观点,不免存在许多错误 Caffe 学习 caffe模型生成需要如下步骤 编写network.prototxt 编写solver.prototxt ...

  10. BZOJ 3787 Gty的文艺妹子序列(分块+树状数组+前缀和)

    题意 给出n个数,要求支持单点修改和区间逆序对,强制在线. n,m<=50000 题解 和不带修改差不多,预处理出smaller[i][j]代表前i块小于j的数的数量,但不能用f[i][j]代表 ...