Mojo函数

news2024/9/19 10:48:40

正如在语言基础中提到的,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://www.coloradmin.cn/o/1961534.html

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

相关文章

华为云上如何创建桶

目录 一、进入对象存储服务(OBS)页面,点击【创建桶】二、输入桶的相关信息三、获取 projectId四、获取 OBS Endpoint五、获取 AK/SK一、进入对象存储服务(OBS)页面,点击【创建桶】 二、输入桶的相关信息 可以勾选购买套餐: 点【立即创建】按钮完成桶的创建。 三、获取…

FPGA开发——数码管的使用

一、概述 在我们的日常开发中,数字显示的领域中用得最多的就是数码管,这篇文章也是围绕数码管的静态显示和动态显示进行一个讲解。 1、理论 (1)数码管原理图 在对数码管进行相关控制时,其实就是对于8段发光二极管和…

LLM还能拿来做异常检测

我从csdn上一路找原文章找到了这一篇 它使用distilbert-base-uncased这个模型给表格数据做文本embedding,并且期望这个LLM已经蕴含了合理的房产相关信息,因此对于没见过的异常房产信息,一定会产生一个与大多数信息embedding都不一样的embedd…

【每日一题】【逆推法 + 贪心】【数学】造数 河南萌新联赛2024第(一)场:河南农业大学 A题 C++

河南萌新联赛2024第(一)场:河南农业大学 A题 造数 题目描述 样例 #1 样例输入 #1 2样例输出 #1 1样例 #2 样例输入 #2 5样例输出 #2 3做题思路 本题可以用逆推法 将三种操作反过来变为 − 1 , − 2 , / 2 -1 , -2 , /2 −1,−2,/2 …

Linux云计算 |【第二阶段】AUTOMATION-DAY4

主要内容: 部署Ansible、Ansible基础命令(Ansible ad-hoc命令格式、Ansible-doc帮助)、Ansible模块常用:脚本与命令模块、文件与账户模块、软件与服务模块、逻辑卷模块 补充:touch 除创建文件外,若再创建相…

DBMotion x Chat2DB:高效迁移,优雅同步,数据腾飞不再愁

DBMotion 基本介绍 数据传输服务DBMotion是一款轻量、绿色的数据库迁移、同步、校验工具。支持国产化数据迁移、支持容灾演练、支持两地三中心和异地多活;源库无感知、简单易集成、丝滑高性能。助您在多云之间随心迁移、自由容灾。 功能介绍 已支持的数据库 v1.…

尚品汇-布隆过滤器解决缓存穿透问题(二十四)

目录: (1)布隆过滤器 (2)布隆过滤器实现方式 (3)CompletableFuture异步编排 (4)CompletableFuture介绍 (1)布隆过滤器 (2&#…

web基础及http协议、

⼀、web基本概念和常识 Web:为⽤户提供的⼀种在互联⽹上浏览信息的服务,Web 服 务是动态的、可交 互的、跨平台的和图形化的。Web 服务为⽤户提供各种互联⽹服务,这些服务包括信息浏览 服务,以及各种交互式服务,包括聊…

vue3警告 `markRaw` or using `shallowRef` instead of `ref`.

百度翻译:Vue收到了一个组件,该组件被制成了一个反应对象。这可能会导致不必要的性能开销,应该通过用“markRaw”标记组件或使用“shallowRef”而不是“ref”来避免。 消除办法是 使用markRaw或者shallowRer代替ref

从原理到实践:开发视频美颜SDK与主播美颜工具详解

本篇文章,笔者将深入探讨视频美颜SDK的开发原理和实践应用,重点介绍如何打造一款功能强大的主播美颜工具。 一、视频美颜的基本原理 视频美颜的核心在于图像处理技术,主要包括面部识别、图像增强和特效处理。 1.面部识别 常见的面部识别算…

设计结构——循环结构

循环结构 什么是循环 代码的重复执行,就叫做循环。 循环的分类 无限循环:程序设计中尽量避免无限循环。(程序中的无限循环必须可控) 有限循环:循环限定循环次数或者循环的条件。 循环的构成 循环体循环条件 循环实现的三要素 循环变量…

深度学习项目 -7-使用 Python 的手写数字识别

一、前言 该文章仅作为个人学习使用 二、正文 项目源代码:深度学习项目 - 使用 Python 进行手写数字识别 - DataFlair (data-flair.training) 数据集:​​​​​​​https://drive.google.com/open?id1hJiOlxctFH3uL2yTqXU_1f6c0zLr8V_K Python 深…

AB安全产品详解Guard master Safety Products

AB安全产品详解Guard master Safety Products

程序员面试中的“八股文”:是助力还是阻力?

“八股文”在实际工作中是助力、阻力还是空谈? 作为现在各类大中小企业面试程序员时的必问内容,“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢?有IT人士不禁发出疑问:程序员面试考…

深入浅出mediasoup—拥塞控制

拥塞控制对于不同网络条件下保证音视频传输质量非常重要。mediasoup 移植了 WebRTC 的 GCC 模块,嵌入到服务器,使得 mediasoup 具备了和 WebRTC 客户端一样的拥塞控制能力。为了使 GCC 能够与 mediasoup 框架良好交互,mediasoup 做了很多适配…

Large Models for Time Series and Spatio-Temporal Data: A Survey and Outlook

基本信息 博客贡献人 谷雨 作者 Ming Jin, Qingsong Wen, et al. 标签 大语言模型、预训练基础模型、大模型、时间序列、时空数据、时态数据 摘要 时态数据,包括时间序列和时空数据,在现实世界的应用中极为广泛。这些数据类型记录了动态系统随时…

2024电赛H题可能用到的代码——自动行驶小车

目录 前言 一、MPU6050零漂处理 二、MPU6050的Yaw(180)误差处理 三、PID算法(增量式位置式) 四、灰度传感器(以8路为例) 1、获取黑线偏差 2、判断ABCD点(有无黑线交点) 五、总结 前言…

内存原生CRAM技术将会颠覆计算存储的未来?

近期,一项刚刚发布的最新研究表明,一种名为计算随机存取存储器(Computational Random-Access Memory, CRAM)的新技术能够极大地减少人工智能(AI)处理所需的能量消耗。这项技术由明尼苏达大学双城分校的一组…

SmartInitializingSingleton和InitializingBean的区别

SmartInitializingSingleton:接口里面就一个方法afterSingletonsInstantiated,它是spring容器将所有bean都初始化完成之后,才会去调用,要求实现它接口的bean必须是单例的。 应用场景:可以在服务启动之后去处理一些逻辑…

红酒与电影:银幕上的醉人瞬间

在光影交织的银幕世界里,红酒不仅是品味生活的象征,更是情感交流的媒介。当定制红酒与电影相遇,它们共同编织出一个个醉人的瞬间,让观众在品味红酒的同时,也沉醉于电影的魅力之中。今天,就让我们一起走进红…