news 2026/5/8 2:03:34

跟老卫学仓颉编程语言开发:函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跟老卫学仓颉编程语言开发:函数

函数在仓颉语言中是普遍存在的。通过之前的章节已经可以了解到仓颉函数的基本形式:main()函数是很多程序的入口点,func关键字用来声明函数。

本节将初步探讨函数,内容包括定义函数、函数参数、函数返回值等。在第11章还会对函数进行深入的讲解。

本节示例可以在“function_demo”应用下找到。

定义函数

仓颉使用关键字func来表示函数定义的开始,func之后依次是函数名、参数列表、可选的函数返回值类型、函数体。其中,函数名可以是任意的合法标识符,参数列表定义在一对圆括号内(多个参数间使用逗号分隔),参数列表和函数返回值类型(如果存在)之间使用冒号分隔,函数体定义在一对花括号内。

以下是一个自定义函数的示例:

// main函数是程序入口main(){// 执行函数println_hello();}// 自定义函数funcprintln_hello(){// 打印Hello World!println("Hello World!");}

上述示例脱胎于“Hello World”应用,只是将打印字符串的逻辑封装到了自定义函数println_hello中。上述例子执行之后输出内容如下:

Hello World!

定义函数需要注意以下几点:

  • 函数名和变量名使用蛇形命名法(snake case),例如println_hello();
  • 函数的位置可以随便放;
  • 如果函数定义了参数,则参数都需要标注类型。

函数参数

仓颉是强类型语言,因此如果函数定义了参数,则参数都需要标注类型,例如:

// main函数是程序入口funcmain(){// 执行函数传递参数lettext=999;println_text(text);}// 如果函数定义了参数,则参数都需要标注类型funcprintln_text(text:Int64){println("text: ${text}");}

上述例子中,println_text函数有一个参数类型是Int64。上述例子执行之后输出内容如下:

text: 999

一个函数可以拥有0个或多个参数,这些参数均定义在函数的参数列表中。根据函数调用时是否需要给定参数名,可以将参数列表中的参数分为两类:非命名参数和命名参数。

非命名参数的定义方式是p: T,其中p表示参数名,T表示参数p的类型,参数名和其类型间使用冒号连接。例如,以下add函数的两个参数a和b均为非命名参数。

func add(a: Int64, b: Int64): Int64 { return a + b; }

命名参数的定义方式是p!: T,与非命名参数的不同是在参数名p之后多了一个“!”。可以将上例中add函数的两个非命名参数修改为命名参数,如下所示:

func add(a!: Int64, b!: Int64): Int64 { return a + b }

命名参数还可以设置默认值,通过“p!: T = e”方式将参数p的默认值设置为表达式e的值。例如,可以将上述add函数的两个参数的默认值都设置为1:

func add(a!: Int64 = 1, b!: Int64 = 1): Int64 { return a + b }

:只能为命名参数设置默认值,不能为非命名参数设置默认值。

参数列表中可以同时定义非命名参数和命名参数,但是需要注意的是,非命名参数只能定义在命名参数之前,也就意味着命名参数之后不能再出现非命名参数。例如,下例中add函数的参数列表定义是不合法的:

// 错误!命名参数之后不能再出现非命名参数 func add(a!: Int64, b: Int64): Int64 { return a + b }

上述函数会报如下错误:

error: unnamed parameters must come before named parameters ==> main.cj:39:21: | 39 | func add(a!: Int64, b: Int64): Int64 { | ~~~~~~~~~ ^^^^^^^^ unexpected unnamed parameter here | | | because it must come before this named parameter | 1 error generated, 1 error printed.

函数参数均为不可变变量,在函数定义内不能对其赋值。

func add(a: Int64, b: Int64): Int64 { a = a + b // 错误! return a }

函数参数作用域从定义处起至函数体结束:

func add(a: Int64, b: Int64): Int64 { var a_ = a // 正确 var b = b // 错误! return a }

函数返回

函数返回值类型是函数被调用后得到的值的类型。函数定义时,返回值类型是可选的:可以显式地定义返回值类型(返回值类型定义在参数列表和函数体之间),也可以不定义返回值类型,交由编译器推导确定。

当显式地定义了函数返回值类型时,就要求函数体的类型、函数体中所有return e表达式中e的类型是返回值类型的子类型,否则则会因为类型不匹配而报错。

以下是一个函数返回的例子:

// main函数是程序入口main(){// 获取函数的返回值leta:Int64=1;letb:Int64=1;letadd_result=add(a,b);println("add result: {add_result}");}// 定义带返回的函数funcadd(a:Int64,b:Int64):Int64{returna+b;}

上述例子中,add函数有两个参数类型都是Int64,该函数会返回Int64类型的值。在函数定义时如果未显式定义返回值类型,编译器将根据函数体的类型以及函数体中所有的return表达式来共同推导出函数的返回值类型。例如,上述例子中add函数的返回值类型可以被省略,但编译器仍然可以根据return a + b推导出add函数的返回值类型是Int64。

返回的值用关键字return标识。如果返回的值,是函数的最后一行,那么也可以不需要关键字return,示例如下:

// 定义带返回的函数funcadd(a:Int64,b:Int64):Int64{// 等同于// return a + b;a+b}

上述例子执行之后输出内容如下:

add result: 2

:函数的返回值类型并不是任何情况下都可以被推导出来的,如果返回值类型推导失败,编译器会报错。指定返回类型为Unit时,编译器会在函数体中所有可能返回的地方自动插入表达式return (),使得函数的返回类型总是为Unit。

参考引用

  • 免费开源书《跟老卫学仓颉编程语言开发》
  • 免费开源书《跟老卫学HarmonyOS开发》
  • HarmonyOS NEXT+AI大模型打造智能助手APP(仓颉版)(视频)
  • 仓颉编程从入门到实践(北京大学出版社)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 16:59:00

速卖通卖家必看:自养号测评提升自然流量的秘籍

在竞争激烈的速卖通市场中,自然流量对于店铺的成功至关重要。自养号测评作为一种有效的流量提升手段,正受到越来越多卖家的关注。以下是速卖通卖家通过自养号测评提高自然流量的详细指南:一、前期准备1.网络环境搭建:选择纯净的海…

作者头像 李华
网站建设 2026/5/3 6:27:31

【Java毕设源码分享】基于springboot+vue的小型民营加油站管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/7 23:10:42

【Java毕设源码分享】基于springboot+vue的农业收成管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/1 17:21:35

计算机毕业设计springboot基于微信小程序的树洞系统 基于微信小程序的匿名树洞交流平台设计与实现 微信小程序环境下树洞信息管理系统的开发

计算机毕业设计springboot基于微信小程序的树洞系统zt81t9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网的飞速发展,人们对于信息交流的需求日益多样化。…

作者头像 李华
网站建设 2026/5/6 6:19:59

港大团队提出 DeepCode ,让 Agent 真能“读论文写可运行代码”

港大团队提出 DeepCode ,让 Agent 真能“读论文写可运行代码” 01 论文概述 这篇论文来自香港大学团队(通讯作者:Chao Huang)。论文提出并开源了 DeepCode :一个能“自动写项目”的智能体框架,想解决的不…

作者头像 李华
网站建设 2026/5/1 11:47:19

Ooder A2UI框架开源首发:构建企业级应用的全新选择

Ooder框架开源首发:构建企业级应用的全新选择 🎉 重磅消息!Ooder框架正式开源发布,版本号0.5! 作为一款专注于企业级应用开发的框架,Ooder以其独特的设计理念和强大的功能,为开发者提供了构建复…

作者头像 李华