Mojo函数

正如在语言基础中提到的,Mojo支持两种类型的函数:def和fn函数。您可以在任何函数中使用这两种声明方式,包括main()函数,但它们具有不同的默认行为,如本页面所述。

我们认为def和fn都有很好的用例,并且不认为其中任何一种比另一种更好。选择使用哪种方式取决于个人口味,以及哪种风格最适合给定的任务。

我们相信Mojo在这方面的灵活性是一种超能力,它允许您以最适合项目的方式编写代码。

在结构体内声明的函数称为“方法”,但它们具有与此处描述的“函数”完全相同的特性。

def函数


def函数提供了与Python的def函数相同的动态性和灵活性。例如,这个函数在Python和Mojo中的工作方式相同:

def greet(name):greeting = "hello," + name + "!"return greeting
def main():print(greet("Mojo"))

执行结果如下图:
在这里插入图片描述
在Mojo中,您还可以选择指定参数类型和返回类型。您还可以使用var声明变量,可以带有或不带有显式类型声明。

def greet(name:String) -> String:var greeting = "hello," + name + "!"return greeting
def main():print(greet("Mojo"))

代码执行如下图:
在这里插入图片描述

这样写的作用是编译器确保name是一个字符串,并且返回类型也是一个字符串。

以下是关于def的所有信息:

  • 参数可以不需要声明类型。
    未声明的参数实际上以object的形式传递,这允许函数接收任何类型(Mojo在运行时推断类型)。
    *返回类型也可以不需要声明,也默认为object。
  • 参数是可变的(通常通过按值传递使用owned参数约定)。
    如果参数是object类型,则以引用的方式接收,遵循对象引用语义。
    如果参数是任何其他声明的类型,则以值的方式接收(使用owned参数约定)。
  • 变量可以不需要使用var进行声明。

object类型

如果您在def函数中不声明参数或返回值的类型,则它将成为一个object,这与标准库中的任何其他类型都不同。

object类型允许动态类型,因为它实际上可以表示Mojo标准库中的任何类型,并且实际类型在运行时推断出来(实际上,在它能表示所有Mojo类型之前还有更多的工作要做)。这对于与Python的兼容性非常有用,并且可以提供动态类型所提供的所有灵活性。然而,这种类型缺乏类型强制执行,当函数接收或返回意外类型时会导致运行时错误。

为了与Python兼容,使用对象引用语义来传递object值。因此,object类型与强制执行值语义的参数约定不兼容。因此,如果在其他强类型值旁边使用object值,则它们的行为可能不一致,因为object是标准库中唯一不符合完全值语义的类型。

fn函数


fn函数提供了严格的类型检查和额外的内存安全性。它基本上强制您在def中编写的可选内容,并确保您不会意外地改变接收到的参数。例如,这是使用fn的相同函数:

def greet(name: String) -> String:greeting = "hello," + name + "!"return greeting
def main():print(greet("Mojo"))print(greetA("Mojo A"))
fn greetA(name: String) -> String:var greeting = "hello," + name + "!"return greeting

运行结果如下图:
在这里插入图片描述
对于函数调用者来说,def函数和fn函数是可以互换的。也就是说,def函数可以做的任何事情fn函数也能做(反之亦然)。区别在于,与def函数相比,fn函数在内部更加严格。
关于fn函数的所有内容如下:

  • 参数必须指定类型(结构体方法中的self参数除外)。
  • 返回值必须指定类型,除非函数不返回值。
    如果不指定返回类型,默认为None(表示没有返回值)。
  • 默认情况下,参数以不可变引用的方式接收(值是只读的,使用borrowed参数约定)。
    这可以防止意外的更改,并允许使用不可复制的类型作为参数。
    如果您想要一个局部副本,可以将值赋给一个局部变量。或者,您可以通过声明inout参数约定来获取对值的可变引用。
  • 必须使用var关键字声明变量。
  • 如果函数引发异常,必须使用raises关键字显式声明异常(def函数不需要声明异常)。

通过强制执行这些类型检查,使用fn函数有助于避免各种运行时错误。与def函数中的动态类型相比,它还改善了性能,因为在运行时不需要处理来确定使用什么数据类型所需的开销 - 类型在编译时固定。

可选参数

可选参数是包括默认值的参数,例如这里的exp参数:

fn pow(base: Int, exp: Int = 2) -> Int:return base**exp
fn use_defaults():# 使用`exp`的默认值var z = pow(3)print(z)
def main():use_defaults()

运行结果如下图:
在这里插入图片描述
但是,您不能为声明为inout的参数定义默认值。

关键字参数


在调用函数时,您还可以使用关键字参数。关键字参数使用格式argument_name = argument_value来指定。您可以以任何顺序传递关键字参数:

fn pow(base: Int, exp: Int = 2) -> Int:return base**exp
fn use_defaults():# 使用`exp`的默认值var z = pow(3)print(z)
def main():use_defaults()print(pow(5, 4))print(pow(base=4, exp=2))

运行结果如下图:
在这里插入图片描述

这样可以更加清晰地表达参数的意图,并且不需要记住参数的顺序。

以上是关于函数的全部内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3279677.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

opencv arm 交叉编译

step1.opencv源码文件夹下新建build-arm目录 step2. cmake图像化配置 cmake-gui .. step3. 选择交叉编译 step4.检索交叉编译链路径 step5. 配置 配置install路径 配置编译、链接选项 添加人脸检测模块 config->generate step6. make编译 built-arm目录下: …

谷粒商城实战笔记-61-商品服务-API-品牌管理-云存储开通与使用

文章目录 一,图片云存储二,阿里云OSS1,OSS2,基于OSS的文件上传架构3,Java中使用OSS 一,图片云存储 这张图展示了文件存储的几种常见模式: 普通上传分布式情况下的普通上传使用自建服务器云存储…

vue3-print-nb实现打印pdf分页

安装插件 npm install vue3-print-nb --savevue3 引入 import print from vue3-print-nb // 打印插件 app.use(print)使用 这里使用的是对象配置方式 对象配置方式——在js中定义一个对象,对象中可配置打印区域相关属性,在需要打印的单据内容最外面的…

Java----反射

什么是反射? 反射就是允许对成员变量、成员方法和构造方法的信息进行编程访问。换句话来讲,就是通过反射,我们可以在不需要创建其对象的情况下就可以获取其定义的各种属性值以及方法。常见的应用就是IDEA中的提示功能,当我…

【FAS】《The Research of RGB Image Based Face Anti-Spoofing》

文章目录 1、原文2、相关工作3、基于特征解耦的人脸活体检测算法3.1、方法3.2、实验结果 4、基于解构与组合的人脸活体检测方法4.1、方法4.2、实验 5、作者总结6、结论(own)7、附录7.1、CycleGAN7.2、InfoGAN7.3、3D Face 1、原文 [1]张克越.基于RGB图像…

民大食堂用餐小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,档口号管理,商家餐品管理,餐品种类管理,购物车管理,订单信息管理 微信端账号功能包括:系统首页&a…

跟着丑萌气质狗学习WPF——自定义按钮模板以及设置触发器

自定义按钮模板以及设置触发器 <Window x:Class"WPF_Study_Solution.Window4"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.micros…

多线程-进阶2

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1.CAS 1.1CAS全称:Compare and swap 比较内存和cpu寄存器中的内容,如果发现相同,就进行交换(交换的是内存和另一个寄存器的内容) 一个内存的…

AB安全产品详解Guard master Safety Products

AB安全产品详解Guard master Safety Products

ubuntu安装并配置flameshot截图软件

参考&#xff1a;flameshot key-bindins 安装 sudo apt install flameshot自定义快捷键 Settings->Keyboard->View and Customize Shortcuts->Custom Shortcuts&#xff0c;输入该快捷键名称&#xff08;自定义&#xff09;&#xff0c;然后输入command&#xff08;…

项目负责人的实战心得:如何高效检查工作

项目负责人的实战心得&#xff1a;如何高效检查工作 前言一、检查工作的重要性二、检查工作的常见误区三、有效的检查策略四、实战案例分析五、持续改进结语 前言 在项目管理的广阔天地中&#xff0c;每一位项目负责人都像是一艘航船的舵手&#xff0c;引领着团队穿越波涛汹涌的…

全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规范大汇总

全网最适合入门的面向对象编程教程&#xff1a;28 类和对象的 Python 实现-Python 编程原则、哲学和规范大汇总 摘要&#xff1a; 本文主要介绍了在使用 Python 进行面向对象编程时&#xff0c;Python 异常处理的原则-“请求谅解&#xff0c;而非许可”&#xff0c;以及软件设…

指针!!C语言 字符串篇(第四篇)

目录 一. sizeof和strlen的对比 二. 数组和指针笔试题解析 2.1 一维数组 2.2 字符数组 2.3 二维数组 一. sizeof和strlen的对比 在C语言中有两个比较相似的知识点&#xff0c;就是sizeof和strlen&#xff0c;下面我们来讲一下它们两者之间有什么不同之处&#xff1f; &a…

【Vue2】3-使用Vue脚手架

目录 初始化脚手架 说明 具体步骤 模板项目的结构 关于不同版本的Vue vue.config.js配置文件 ref属性 配置项props mixin&#xff08;混入&#xff09; 插件 scoped样式 总结TodoList案例 webStorage&#xff08;浏览器本地存储&#xff09; TodoList本地存储 组…

数据链路层mac帧、mac地址,ARP协议

数据链路层&#xff1a;用于两个设备(同一种数据链路节点)之间进行传递 mac地址决定&#xff1a;当前在那&#xff0c;下一站去哪 mac协议&#xff1a; mac帧在数据链路中是如何传输的&#xff1a; ARP地址解析协议&#xff1a;IP地址解析协议 通过ip进行了路径选择&#xf…

打卡第28天------贪心算法

加油啦,一定要好好学习,刷题面试 一、买卖股票的最佳时机 II leetcode题目链接:买卖股票的最佳时机 II 题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股…

Scrum敏捷开发企业级实训:提升团队效率,推动企业创新

在当今快速变化的商业环境中&#xff0c;企业必须不断创新和快速响应市场需求&#xff0c;以保持竞争优势。Scrum敏捷开发方法作为一种高效的项目管理框架&#xff0c;已被全球众多企业采用&#xff0c;用于提高团队协作和交付速度。为了帮助企业更好地理解和应用Scrum&#xf…

【每日一题】【回溯+二进制优化】[USACO1.5] 八皇后 Checker Challenge C\C++\Java\Python3

P1219 [USACO1.5] 八皇后 Checker Challenge [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 6 6 6 \times 6 66 的跳棋棋盘&#xff0c;有六个棋子被放置在棋盘上&#xff0c;使得每行、每列有且只有一个&#xff0c;每条对角线&#xff08;包括两条主对角线的…

【Linux-IMX6ULL-阻塞与非阻塞】

目录 1 阻塞与非阻塞2 实现阻塞式访问的方法2.1 等待队列2.1.1 等待队列头2.1.2 等待队列项2.1.3 将队列项添加/移除等待队列头2.1.4 等待唤醒 2.2 轮询2.2.1 select()函数2.2.2 poll()函数2.2.3 epoll()函数2.2.4 总结 3 驱动里面的poll()函数4 等待队列实验4.1 未进行阻塞式访…

推荐5款好用的将pdf翻译成中文的工具。

像word&#xff0c;PPT,Excel等这些文档如果要翻译的话&#xff0c;即使没有合适的工具也可以复制粘贴内容。可PDF有的时候是不可以编辑的&#xff0c;很难用这种方法实现翻译。但是这5款翻译工具就可以做到直接将PDF文件进行翻译。 1、365pdf在线翻译 直达&#xff1a;https:…