
字节笔记本
2026年10月7日 · 约 5 分钟读完
闭包问候会带上传入的名字
笔记把闭包定义成可以传来传去的函数代码块。基本形式是花括号,括号里是参数,箭头后面是返回类型,然后是 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,下一行是语句,再一行是右花括号。对照示例,示例把这三行填上了具体的名字和问候。



