ResultBuilder学习笔记三:支持循环

ResultBuilder学习笔记三:支持循环

我们在前面的博文中创建了一个非常简单的结果构建器ConcatBuilder,用于连接多个字符串,随后在后续博文中对之进行了扩展,使其可以支持自定义的输入数据类型,这个特性非常重要,它是DSL的基础。 这篇博文将继续对ConcatBuilder进行扩展,这次,我们讨论如何增加对循环的支持。

理解循环

ConcatBuilder 已经可以支持IntStringStar为输入。只要愿意,还可以增加更多的数据类型。但是,如果要使用它拼接1到10 个整数,该如何呢?,当然可以像下面这样:

 @ConcatBuilder var str:String  { 12345678910    }print( str ) 

但是,100个1000个整数呢,总不至于写100遍1000遍吧。 我们当然希望按下述循环方式:

 @ConcatBuilder var str:String  { "春眠不觉晓""处处闻啼鸟"for i in 1...100 {i    }}

这时,就需要ResultBuilder能够支持循环了。

支持循环

就像能够轻易支持多种输入数据类型一样,ResultBuilder也可以轻易支持循环, 只需要增加某种类型的buildArray函数即可。对于我们的场景, 在ConcatBuilder中像下面这样实现buildArray函数:

  static func buildArray(_ components: [String]) -> String {return components.joined(separator: "")}

再次运行,结果如下:

春眠不觉晓处处闻啼鸟123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100

没错,就这么简单!可能你已经注意到,为什么上述buildArray的输入参数不是整数而是字符串类型呢?答案是前面的buildExpression (_ component: Int) 函数,ResultBuilder会使用该函数将for-in循环中的每个整数首先转换成字符串,最终构成一个临时的字符串数组,然后再调用buildArray函数输出。这些识别,调度和转换都由ResultBuilder自动完成,我们无需关心。这也正是ResultBuilder设计精妙之处。

由于有了不同的buideExpression()函数,如下循环代码都可以正常工作:

 @ConcatBuilder var str:String  { "春眠不觉晓""处处闻啼鸟"//整数for i in 1...5{i }//自定义类型for i in 1...3{Star(length:i)}//混合for i in 1...3{iStar(length:i)  "字符串\(i)"}}

ConcatBuilder 完整代码

struct Star{let length:Intfunc getString()->String{return    Array(repeating:"*",count:length).joined()}}@resultBuilderstruct ConcatBuilder {//最终输出static func buildBlock(_ components: String...) -> String {return components.joined(separator: "")}//支持整数输入static func buildExpression (_ component: Int) -> String {return "\(component)" }//支持字符串输入static func buildExpression (_ component: String) -> String {return  component }//支持自定义类型输入 static func buildExpression (_ component: Star) -> String {return  component.getString() }//支持for-in循环static func buildArray(_ components: [String]) -> String {return components.joined(separator: "")} 
}

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

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

相关文章

数据库语言:DDL与DML详解

目录 数据库语言:DDL与DML详解引言数据定义语言(DDL)什么是DDL?DDL的作用和重要性DDL常用命令DDL示例和用法 数据操纵语言(DML)什么是DML?DML的作用和重要性DML常用命令DML示例和用法 DDL与DML的…

智能制造六大核心发展方向,驱动企业数字化转型

在制造过程中,智能制造展现出非凡的活力,它使人与智能机器的协同工作成为可能。这不仅将制造自动化的概念提升至一个新的层次,更将其扩展至柔性化、智能化和高度集成化的领域。通过这样的革新,我们得以实现数字化智能工厂的落地生…

Linux的学习之路:5、粘滞位与vim

摘要 这里主要是把上章没说完的权限的粘滞位说一下,然后就是vim的一些操作。 目录 摘要 一、粘滞位 二、权限总结 三、vim的基本概念 四、vim的基本操作 五、vim正常模式命令集 1、插入模式 2、从插入模式切换为命令模式 3、移动光标 4、删除文字 5、复…

Spring MVC体系结构和处理请求控制器(一)

一、MVC模式 MVC模式是指Model-View-Controller(模型-视图-控制器)模式,是开发Web应用程序时常用的一种代码分层模式MVC模式是软件工程中的一种架构模式,会强制行的把系统的输入、处理和输出分开,是系统从功能上形成M…

我的小程序接口被刷爆了

自然流量的惊喜 书接上文,凭着短视频的好奇,搭了个小程序,做了文案提取,配音等功能,也顺带写了两篇口水文章,不曾想居然收获历史最高的点赞与收藏。有兴趣的朋友可以点这里一看究尽:《短视频配音…

B02、GC日志分析-案例演示-6.4

1、案例一&#xff1a;堆溢出演示 1.1、简单springboot项目创建 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:s…

立方变自身 蓝桥杯 java

题目 观察下面的现象,某个数字的立方&#xff0c;按位累加仍然等于自身。 1^3 1 8^3 512 5128 17^3 4913 491317 … 请你计算包括1,8,17在内&#xff0c;符合这个性质的正整数一共有多少个&#xff1f; 请填写该数字&#xff0c;不要填写任何多余的内容或说明性的文字。 答…

环形队列的简单理解

多次遇到环形队列的情况&#xff0c;记不住什么情况是队列满&#xff0c;什么情况是队列空。一直也没有理解透彻。 仔细研究了一下&#xff0c;掌握了一些原理&#xff0c;记录一下。 1. 环形队列有一个头指针head&#xff0c;一个为指针tail。有一个疑问&#xff1a;head和ta…

更换淘宝镜像地址,旧的已经失效(https://registry.npm.taobao.org )

旧的镜像地址&#xff1a;npm install --registryhttps://registry.npm.taobao.org 新的镜像地址&#xff1a;npm install --registryhttps://registry.npmmirror.com

【2024最新博客美化教程重置版】今天教你如何使用SimpleMemory美化你的博客,体会一下大神是如何装逼的!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 SimpleMemory …

代理与反向代理

Java项目的代理与反向代理 1. 代理 定位&#xff1a;为客户端服务通信方向&#xff1a;客户端->代理服务器->远程服务器好处&#xff1a;对客户端行为进行过滤和控制&#xff1b;隐藏客户端IP地址&#xff1b;审计流量&#xff1b;缓存资源加快访问速度&#xff1b; 2…

ChatGPT 写作利器:探索ChatGPT在论文写作中的应用

ChatGPT无限次数:点击直达 ChatGPT 写作利器&#xff1a;探索ChatGPT在论文写作中的应用 引言 ChatGPT是一种强大的自然语言处理工具&#xff0c;能够为我们提供高效、准确的文本生成功能。在论文写作领域&#xff0c;ChatGPT的应用也逐渐受到关注。本文将探讨ChatGPT在论文写…

javascript:call()、apply()、bind()的区别和使用

javascript&#xff1a;call()、apply()、bind()的区别和使用 1 前言 记录javascript的call、apply、bind方法绑定this的区别以及使用。 call、apply、bind的区别&#xff1a; 【相同点】&#xff1a;作用相同&#xff0c;都是动态修改this指向&#xff1b;都不会修改原先函…

【算法基础】插入排序与二分查找、升级二分查找

文章目录 1. 插入排序1.1 插入排序的思想1.2 插入排序的实现 2. 普通二分查找2.1 普通二分查找的思想2.2 普通二分查找的实现 3. 升级二分查找3.1 升级二分查找思想3.2 升级二分查找实现 1. 插入排序 1.1 插入排序的思想 插入排序很类似于已有一副有序的扑克牌&#xff0c;不断…

【话题】AI技术创业有那些机会,简单探讨下

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景机会一、引言二、AI技术的创业机遇1.智能服务行业的兴起2.数据驱动的业务模式创新3.AI与产业融合的创新发展 三、AI技术创业的挑战1.技术门槛高2.法规政策的不确定性…

P1712 [NOI2016] 区间(线段树 + 贪心 + 双指针)

题目描述 在数轴上有 n 个闭区间从 1 至 n 编号&#xff0c;第 i 个闭区间为 [li​,ri​] 。 现在要从中选出 m 个区间&#xff0c;使得这 m 个区间共同包含至少一个位置。换句话说&#xff0c;就是使得存在一个 x &#xff0c;使得对于每一个被选中的区间 [li​,ri​]&#…

关于Ansible模块 ⑥

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 内容在继《关于Ansible的模块 ①》、《关于Ansible的模块 ②》、《关于Ansible的模块 ③》、《关于Ansible的模块 ④》与《关于a…

YOLOv8草莓生长状态(灰叶病缺钙需要肥料)检测系统(python开发,带有训练模型,可以重新训练,并有Pyqt5界面可视化)

本次检测系统&#xff0c;不仅可以检测图片、视频或摄像头当中出现的草莓叶子是否有灰叶病&#xff0c;还可以检测出草莓叶是否缺钙、是否需要施肥等状态。基于最新的YOLO-v8训练的草莓生长状态检测模型和完整的python代码以及草莓的训练数据&#xff0c;下载后即可运行&#x…

Java开发中的entity、vo和pojo

Java开发中的entity、vo和pojo 1.Entity实体2.vo3.pojo 1.Entity实体 定义&#xff1a; Entity 通常指的是与数据库表对应的对象。它包含了与数据库表字段相对应的属性和一些业务逻辑方法。Entity 通常用于数据的持久化操作&#xff0c;如增删改查。使用场景&#xff1a; 当需…

C语言——字符函数和字符串函数

Hello&#xff0c;大家好&#xff0c;今天和大家分享C语言中的几个字符函数和字符串函数&#xff0c;记得三连支持一下哦&#xff01; 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数…