ByteNoteByteNote
闭包问候会带上传入的名字
字

字节笔记本

2026年10月7日 · 约 5 分钟读完

闭包问候会带上传入的名字

API中转
¥120

笔记把闭包定义成可以传来传去的函数代码块。基本形式是花括号,括号里是参数,箭头后面是返回类型,然后是 in,再是语句。

完整形式先跑通

示例把闭包赋给 greet。参数 name 是字符串,返回也是字符串。函数体返回一句问候,名字插在中间。调用时传入 Alice,打印出来的是 Hello, Alice!。

传入名字后打印这句问候

类型和 return 都写全,是为了对照后面的简写省掉了什么。笔记列出四种简写的名字,没有再写出省掉之后的代码。含义要按这四个名字来理解,不要把没出现的写法说成笔记里已经画出来的。

第一项是省略参数类型和返回类型。前提是上下文已经知道这些类型。上下文不知道时,省略会在编译期失败,而不是打印出另一句问候。

第二项是单表达式的隐式返回。函数体只有一个表达式时可以不写 return。有多条语句时,返回仍要写明。问候这个例子只有一条返回,才谈得上这一项。

第三项是参数名缩写。缩写之后就没有 name 这个名字了,用序号指代参数。笔记没有写出序号形式。确认完整例子能打印之后,再试缩写。

第四项是尾随闭包。闭包是函数的最后一个参数时,可以挪到调用括号后面。不是最后一个参数时不能挪出去。greet 本身就是一个闭包值,这条是给别的函数用的,不要套在 print 那一行上。

四项可以叠用,但每一项都依赖上下文已经足够。每省一项都再打印一次。问候不应改变。变了就说明省掉的不是笔记说的那一项。

闭包可以记住定义处的常量和变量。记住意味着持有那些值。对象的方法里若把闭包当回调,闭包又抓住了对象,两边就解不开。

笔记写的办法是弱引用或无主引用,写在捕获列表里,对象用 self。弱引用在对象已经释放时是空的,使用前要判断。无主引用假定对象还在。对象先没了再调用,会直接出错。

笔记只点了这两个名字,没有给出选择表。对象的生命周期比回调短时,用弱引用。能保证回调期间对象还在,才考虑无主引用。

笔记的画布高度停在最后一行的基线位置。最后一句注意事项贴着底边。阅读时以文字为准,不要因为底边裁切就以为没有循环引用这一条。

对话没有把逃逸、自动闭包写进这张笔记。后附的综述若提到别的语法,不要写成这张图上已经有的内容。图上只有定义、语法、示例、四种简写、捕获,以及弱引用和无主引用。

Alice 只是示例字符串。换成别的名字,问候里的那一段跟着变。打印的前缀仍是 Hello 加逗号。

捕获列表不是必填

先让完整写法跑通,确认输出是 Hello, Alice!。再按四项逐项删。最后才加捕获列表。不要在问候还没打印对的时候就改成无主引用。

弱引用在对象消失后是空的

花括号、箭头和 in 都在。少了 in,后面的语句就不属于这个闭包。少了箭头,返回类型就没地方写。完整形式是对照简写的底稿。

参数是 name,类型是 String。返回类型也是 String。调用时传的是字符串字面量。传别的类型,在这一份完整写法里通不过类型检查。

插值写在返回的字符串里。打印语句没有再拼一次名字。输出里的名字只来自参数。

简写不是另一套语义。省掉类型、省掉 return、换参数写法、把闭包挪到括号外,算出来的结果应和完整形式相同。

捕获列表写在参数前面。弱引用和无主引用解决的是互相持有,不是让问候字符串变成可选值。只有抓住对象时才需要它们。

这个例子没有使用 self。给 greet 加捕获列表没有对应的循环。捕获列表留到回调确实抓住对象的时候再写。

图片笔记用等宽字体标代码,用普通字体标说明。读的时候把蓝色代码和旁边的中文说明分开。说明里的四条简写没有对应的代码行。

输出注释写在打印那一行后面。注释不是第二句打印。运行结果只有一句问候。

定义说闭包可以在代码中被传递。greet 先赋给常量,再当作函数调用。这就是传递之前的最小形式。把它传给别的函数时,规则不变。

无主引用不要用在生命周期没把握的回调上。笔记把两个名字并列,使用时先选弱引用。弱引用为空就跳过,不要强制解包。

单表达式隐式返回只省 return。字符串内容不变。不要把隐式返回理解成会自动打印。打印仍是外面的 print。

尾随闭包改变的是调用写法,不改变闭包内部的参数。greet 的参数仍然是那个名字。不要为了尾随而改问候的拼接。

笔记是一张图。图上的语法行是参数、箭头、返回类型、in,下一行是语句,再一行是右花括号。对照示例,示例把这三行填上了具体的名字和问候。

相关文章

分享: