Pony语言学习(二):基础类型 之 Class

2023-05-16

写在前面的:

这次咱们来唠唠Pony的基础类型,这里说的基础类型指的不是int, string, boolean, float什么内置数据类型,而是Pony中用来定义类型的几种方法,分别是:Class, Primitive, Actor, Trait, Interface, Struct, Type Alias, Type Expressions

Class:

class关键字用于声明一个类。那么什么是一个类呢?一个类就是一种类型,例如狗就是一个类,它可以汪汪叫,可以吃,这是它被定义的行为(方法),它也可以有一个名字,这就是它的属性,也叫做字段。那么我们这里举一个例子:

class Dog
    let dna: String = "DNA"
    var name: String
    
    new create(name': String) => name = name'
    fun scream(): String => "汪汪"
    fun eat(food: String): String => "我吃了" + food

var用来声明变量(这里是可变属性),意思是这个量可以变化,后面跟的是变量名,再之后是该变量的类型,类型和变量名之间用冒号分隔。而let用来声明常量(这里是不可变属性),意思是这个量一旦赋了一个值,就不能再改变它。

fun用来声明函数(这里叫做方法),后面跟一个函数名,再跟一个参数列表,参数列表与返回值类型之间也是用冒号分隔,之后就是=>,这个符号用来告诉编译器,函数头(head)已经结束,现在要编写的是函数体(body)的代码

我们可以发现,参数列表里的参数,和声明变量相似: 参数名: 参数类型。如果参数多的话,用逗号分隔。

new用来声明构造方法。我们暂且不谈什么是构造方法。

一个类在实例化后会产生一个对象,那么什么是对象呢?我们说过,狗可以是一个类,举个例子哈,隔壁王小明买了一条狗,叫旺财,这条狗有名字,也就是说,一条狗(类)的一个属性——名字(name)被定义为 旺财,那么我们管旺财就叫做狗的一个对象。一个类具体(实例)化后,就产生了一个对象。

我们也可以这样理解,类是总称,对象是其中任意一个。

而我们如何具体化类呢?我们就要用到构造方法。在声明一个对象时,Pony会自动帮我们调用构造方法。我们在构造方法的参数列表中定义了一个name'参数,之后会把这个参数赋值给name。因此name有了具体的值,于是就有了一个Dog的对象。

注意!name'这个参数不是一定就要叫这个名字,它可以是_name(其他语言常用),dog_name, dName, dogName等等,这里在name后面加了一个单引号,只是为了区分属性和参数。

记住,类如果要实例化成一个对象,那么这个类中一定要有构造方法!!!系统在实例化对象时,默认调用的是create构造方法,因此你不用写:let dog = Dog.create()。如果你想用其他的构造方法去实例化对象,记住,在实例化对象时,一定要加上这个特定的构造方法名:

class Dog
    //省略
    new has_no_name() =>
        name = "Dog"
actor Main
    new create(env: Env) =>
        let dog = Dog.has_no_name()   //非字段/属性可以使用类型推断
        env.out.print(dog.name) //会输出Dog

 

有些读者会问,1.为什么函数、方法返回值不用return语句,是没有return语句吗?2.难道函数/方法返回都是最后一行的表达式的值吗?

 

Answer1->在通常情况下,函数/方法的确返回的是最后一行的表达式的值。但是,这不代表没有return语句。在Pony中,有return语句

Answer2->函数/方法只在大多数情况下返回最后一行的表达式的值,但是,在某些情况下就需要return语句了,例:

fun demo(n: U64): U64 =>
    if n > 0 then
        return n
    else
        return 0

这里我们把if当做语句来看待。在这个例子中,return语句用来提早返回值。在我们学到控制结构之后,就会明白,if语句其实也可以被当做表达式来看待(类似Rust),所以上面的代码可以这样重写:

fun demo(n: U64): U64 =>
    if n > 0 then
        n
    else
        0

啊呀,忘了解释一下了,这里的U64指的是unsigned int64,即64位的无符号整数。

实例化对象:

我们讲过,实例化对象要使用构造函数,那好,我们来看一个例子:

actor Main
	new create(env: Env) =>
	    let d1: Dog = Dog("旺财")
            env.out.print(d1.scream())

在这个例子中,我们声明了一个常量(因为我们不须在改变它的值),注意它的类型:Dog,实例化对象就像声明变量或常量一样,要先指明类型(其实,如果等号后面的量是明确类型的,可以直接赋值,不必显示声明类型,这个叫做类型推断。属性/字段不能使用类型推断!我们为了教学方便,暂时不说类型推断),之后跟一个类型带一个括号,这就表明要调用构造方法。我们这里向构造方法传送了一个值,我们会得到一个Dog的对象。之后我们可以调用这个对象的方法。

析构方法:

析构方法是在对象被销毁之前,系统默认调用的方法,它只能有一种形式:fun _final()。

总结:

 

  • 声明一个类用class关键字
  • 类中可以有属性(也叫字段),可以是变量或常量,属性/字段不能使用类型推断
  • 类里也可以有方法,方法/函数的声明用fun关键字,后面依次接 1.函数名 2.参数列表(参数的声明方式和属性类似,参数名: 参数类型;参数大于1,要用逗号分隔) 3.返回值类型(注意与参数列表之间的冒号) 4. => 5.函数体
  • 类如果要实例化为一个对象,一定要有构造方法,构造方法用new声明。系统默认调用的是create构造方法,如果你想用其他的构造方法去实例化对象,记住,在实例化对象时,一定要加上这个特定的构造方法名。
    class Dog
        //省略
        new has_no_name() =>
            name = "Dog"
    actor Main
        new create(env: Env) =>
            let dog = Dog.has_no_name()   //非字段/属性可以使用类型推断
            env.out.print(dog.name) //会输出Dog
  • 通常情况下,函数/方法会返回最后一行表达式的值;但是,如果要提前返回值,一定要用return语句
  • 实例化对象和声明变量或常量相似,等号后面的值应是  类名(参数)

写在后面的:

大家学了很久了,辛苦啦!我的教程和官网不一样,大家如果想看些更仔细的,可以去看一看官网的class教程:https://tutorial.ponylang.org/types/classes.html

另外,我想提醒一下大家,类型推断的前提是要有明确类型的值。但是,一个数字就不能被默认推断,因为它的类型可以是U64,U32等等,还有浮点数,它的类型可以是Float32,Float64。如果真的想用类型推断,就要这样做,例:

var integer = U64(10)

因为博主吃过这样的亏,所以想让大家少走弯路。还有一点,print只能输出字符串,欲输出数值变量/常量,要调用string()函数。如下所示:

let a = U64(888)
env.out.print(a.string())

就会输出888啦!这其实就是显式类型转换。(为了安全?)

好啦,我们下次见!欢迎加入Pony语言QQ群261824044!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pony语言学习(二):基础类型 之 Class 的相关文章

  • 【具体实现过程】百度地图POI区域的边界经纬度坐标数据采集

    最近有个项目需要拿到百度地图中XXX市中所有学校的边界坐标 经过一下午的努力 xff0c 终于成功拿到了坐标 xff0c 对坐标数据还原和验证 特此记录一下具体实现过程和爬取思路 前言 xff1a 什么是POI xff1f Point of
  • Gazebo仿真平台模型搭建与修改

    ROS进阶教程 xff08 一 xff09 Gazebo仿真平台模型搭建与修改 文件讲解Models 文件World文件Launch文件 模型编辑可视化操作配置文件编辑 仿真操作流程完成model建模world文件和launch文件修改 其
  • XShell过期需要采购解决办法

    有天Xshell更新完再打开 xff0c 提示我去采购 xff0c 当然采购得花钱 xff0c 所以下面方法是解决这一问题 1 跳到官网 https www netsarang com download free license html
  • 【SMT32CubeMx安装详解】

    SMT32CubeMx安装详解 文章目录 SMT32CubeMx安装详解 前言一 准备工作二 CubeMax安装三 工程参数配置总结 前言 记录CubeMax软件安装和相关工程配置的简单操作 一 准备工作 在我们进行软件安装之前首先将我们需
  • AirSim无人机仿真平台(windows)

    1 环境 xff1a UE4 26 43 AirSim 43 VS2019 2 安装步骤 xff1a 1 xff09 先下载Epic Games安装启动器 xff0c 然后再安装UE4 26 xff1b 2 xff09 安装VS2019社区
  • ubuntu18在docker下运行kalibr

    一些命令 docker images sudo docker run it kalibr latest sudo docker run it v local path docker path respository bin bash sud
  • 机器人避障规划算法之VFH系列算法研究现状

    机器人路径规划算法可以分为全局路径规划与局部路径规划 xff0c 全局规划算法一般需要地图信息作为先验知识 xff0c 而局部规划算法利用传感器探测环境信息避开障碍物 常用的全局算法算法有可视图法 xff0c 栅格地图法 xff0c 智能算
  • Windows配置ArUco

    windows10 vs2019 opencv3 4 6 注意 xff0c 一定要选择与opencv版本一样的opencv contrib 进行编译 xff0c 否则将会出现错误 xff0c 有很多的工程不能编译通过 xff0c 不能产生相
  • ArUco估计位姿原理

    ArUco使用 PnP OpenCV aruco 校准相机 Camera Calibration Demo 使用opencv的aruco库进行位姿估计 include lt opencv2 core core hpp gt include
  • 传递函数极点与微分方程的解

    如何解微分方程 setting y 61 e rx xff0c 点睛之笔
  • MPC控制

    基于状态空间模型的控制 模型预测控制 xff08 MPC xff09 简介 对基于状态空间模型的控制理解得很到位 在这里我重点讲解一下状态空间 模型 那么什么是状态 xff1f 输出是不是也是状态的一种 xff1f 对的 xff0c 输出也
  • @卡尔曼滤波理解

    Kalman Filter For Dummies 翻译 如何用卡尔曼滤波算法求解电池SOC xff08 基础篇 xff09 转载留存 卡尔曼滤波算法详细推导 这一篇对预备知识的介绍还是很好的 xff0c 过程与原理讲解也很到位 xff0c
  • 全景避障、VIO

    VINS Mono代码分析与总结 完整版 单目与IMU的融合可以有效解决单目尺度不可观测的问题 鱼眼摄像头SLAM xff1a PAN SLAM 全景相机SLAM 原论文 xff1a Panoramic SLAM from a multip
  • CAN总线-ACK应答机制分析

    1 xff1a 应答场定义 应答场长度为 2 个位 xff0c 包含应答间隙 xff08 ACK SLOT xff09 和应答界定符 xff08 ACK DELIMITER xff09 在应答场里 xff0c 发送站发送两个 隐性 位 当接
  • 树莓派4b 引脚图

    树莓派 4B 详细资料
  • 控制~线性系统~的能控性和能观性

    现控笔记 xff08 四 xff09 xff1a 能控性和能观性 能控性 xff1a 是控制作用u t 支配系统的状态向量x t 的能力 xff1b 回答u t 能否使x t 作任意转移的问题 能观性 xff1a 是系统的输出y t 反映系
  • 创建功能包

    创建功能包 xff1a catkin create pkg 在Amos WS src路径下 xff0c 打开控制台输入catkin create pkg my package std msgs rospy roscpp 创建一个名为my p
  • SLAM算法

    一 概述 Simultaneous Localization and Mapping SLAM 原本是Robotics领域用来做机器人定位的 xff0c 最早的SLAM算法其实是没有用视觉camera的 xff08 Robotics领域一般
  • 激光雷达入门

    转载自 xff1a https zhuanlan zhihu com p 33792450 前言 上一次的分享里 xff0c 我介绍了一个重要的感知传感器 摄像机 摄像机作为视觉传感器 xff0c 能为无人车提供丰富的感知信息 但是由于本身
  • 【超详细】韦东山:史上最全嵌入式Linux学习路线图

    我是1999年上的大学 xff0c 物理专业 在大一时 xff0c 我们班里普遍弥漫着对未来的不安 xff0c 不知道学习了物理后出去能做什么 你当下的经历 当下的学习 xff0c 在未来的一天肯定会影响到你 毕业后我们也各自找到了自己的职

随机推荐

  • ArUco码辅助定位——计算机视觉

    使用USB网络摄像头和ROS跟踪ArUco Markers
  • 基于D435i的点云重建

    Task 采用D435i采集深度图和RGB图像 xff0c 进行点云重建和聚类 1 xff09 解析Bag数据 xff1a import os import cv2 import numpy as np import rosbag from
  • vncviewer黑屏问题解决

    最近在重启服务器后 xff0c 用vnc进行远程桌面连接时 xff0c vnc能够连上 xff0c 或有提示错误 xff0c 或无提示错误 xff0c 但显示黑屏 在网上搜索了甚久 xff0c 各种google xff0c 各种baidu
  • Unbuntu 系统及VNC Viewer显示中文

    一行命令搞定 xff1a apt get install ttf wqy zenhei
  • 在嵌入式Linux系统上安装打印机

    简介 xff1a 在Linux环境中安装打印机 xff0c 通常是cups ghostscript等 xff0c 但体积通常很大 xff0c 几十兆 在我应用的环境 xff0c 要求打印模块不大于5M xff0c 在网上搜索的方案是将cup
  • 深度学习环境搭建:win10+GTX1060 + tensorflow1.5+keras+cuda9.0+cudnn7

    2018年 2月8日下午 xff0c 开始搭建环境 我新买了联想Y720笔记本电脑一台 xff0c 希望用它来开展深度学习的探索 根据之前的一点点经验 xff0c 搭建深度学习的环境 本篇博客主要记录的是流程 xff0c 不提供相关数据的下
  • Linux C/C++面试题汇总

    Linux C C 43 43 面试题汇总 前言计算机基础程序的内存空间进程和线程相关 关键字conststaticvolatile C C 43 43 指针 前言 最近面试的比较多 xff0c 看了很多关于面试的内容 xff0c 有些平时
  • NVIDIA TX2--3--NVIDIA Jetson TX2 查看系统版本参数状态及重要指令

    Yolov 1 TX2上用YOLOv3训练自己数据集的流程 VOC2007 TX2 GPU Yolov 2 一文全面了解深度学习性能优化加速引擎 TensorRT Yolov 3 TensorRT中yolov3性能优化加速 xff08 基于
  • freertos之timer浅析

    背景 freertos的定时器与我所见得到其他RTOS不一样 xff0c 我知道的ucosii是在每次tick 43 43 的时候会检查定时器链表 xff0c smc rtos也是这样做的 xff0c rtt没看过源码不清楚 xff0c 而
  • vins-fusion gps融合相关总结

    1 简介 xff1a VINS Fusion在VINS Mono的基础上 xff0c 添加了GPS等可以获取全局观测信息的传感器 xff0c 使得VINS可以利用全局信息消除累计误差 xff0c 进而减小闭环依赖 相比于局部传感器 xff0
  • vins-mono里的坐标系

    vins mono里主要涉及三个坐标系 xff1a word坐标系 xff0c body坐标系即IMU帧坐标系 xff0c cam坐标系即相机帧坐标系 对于单目系统而言 xff0c 初始化时就会确定世界坐标系 首先进行纯视觉初始化 SFM
  • 华三交换机配置telnet远程登录和http、https登录

    1 配置管理IP地址 lt H3C gt system view 进入系统视图 H3C int vlan 1 进入管理VLAN1 H3C Vlan interface1 ip address 1 1 1 1 24 配置默认管理IP地址 H3
  • C——char(字符串)转int

    有时候需要对输入的数字进行计算之类的操作 xff0c 这时候需要将char转int类型 char是一个单独字节 xff0c 可以保存一个本地字符集的内容的类型 一般使用char 的格式来使用 int就是一个范围较小的无符号整数类型 注意 x
  • Linux设备驱动——第三章字符驱动

    当对幸福的憧憬过于急切 xff0c 那痛苦就在人的心灵深处升起 加缪 本章的目的是编写一个完整的字符设备驱动 我们开发一个字符驱动是因为这一类适合大部分简单的硬件设备 字符驱动也比块驱动易于理解 本章的最终目的是编写一个模块化的字符驱动 x
  • FreeRTOS(一)系统时钟和中断

    RTOS系统运行必需要有时钟 xff0c FreeRTOS可以选择SysTick或TIM作为时钟源 本文以再stm32f1上的移植介绍 选择SysTick需要在FreeRTOSConfig h中取消SysTick Handler 函数的映射
  • 对于USB Bulk通信发送0包的理解

    写Device USB驱动的时候 xff0c 当Bulk送信发送的数据长度恰好是wMaxPacketSize的整数倍时 xff0c 是否应该发送0包的问题搞得我焦头烂额 查找了好多资料 xff0c 有的说要加 xff0c 这是USB协议的一
  • upload漏洞专题

    一 upload上传绕过专题 后缀检验绕过 1 黑名单检测绕过 1 上传文件重命名 span class token comment 由于只有后缀是可控的 span 所以常见的后缀为php中 php2 php3 php4 php5 phtm
  • Pony语言学习(七)——表达式(Expressions)语法(单篇向)

    一 字面量 xff08 Literals xff09 xff08 一 xff09 Bool值 xff1a 没啥要说的 xff0c 就是true和false x1f44a xff08 二 xff09 数值 xff08 Numeric Lite
  • Pony语言学习(八):引用能力(Reference Capabilities)

    xff08 如果你有更好的翻译 xff0c 请务必联系我 我们需要和Rust术语做到翻译看齐 xff09 一 总览 xff08 特译 xff1a https tutorial ponylang io reference capabiliti
  • Pony语言学习(二):基础类型 之 Class

    写在前面的 xff1a 这次咱们来唠唠Pony的基础类型 xff0c 这里说的基础类型指的不是int string boolean float什么内置数据类型 xff0c 而是Pony中用来定义类型的几种方法 xff0c 分别是 Class