0%

到底怎么迭代一个Array?

前两天晚上摸鱼的时候看到同学发来的微信消息,当时没过脑子,只想了一句“数组也可以into_iter吧”就完了。

摸完之后自己试了一下,发现这样还是不可以:

1
2
3
let a = [1, 2, 3, 4];
let s = a.into_iter().reduce(|sum, i| sum + i);
println!("{}", s);

编译器要求reduce中的lambda返回类型是&i32而不是i32。这就奇了怪了:into_iter不是获得所有权的迭代吗?为什么要求引用呢?

于是去查文档,在这里查到了这个:

Prior to Rust 1.53, arrays did not implement IntoIterator by value, so the method call array.into_iter() auto-referenced into a slice iterator. Right now, the old behavior is preserved in the 2015 and 2018 editions of Rust for compatibility, ignoring IntoIterator by value. In the future, the behavior on the 2015 and 2018 edition might be made consistent to the behavior of later editions.

Starting in the 2021 edition, array.into_iter() will use IntoIterator normally to iterate by value, and iter() should be used to iterate by reference like previous editions.

换言之,在Array没有实现IntoIterator的情况下,对Array做.into_iter()会被自动变成切片的迭代器。在Rust 1.53版本及之后且Rust Edition为2021(暂时,以后可能对2015和2018 Edition统一行为)时,才会采用新行为,默认对值迭代。

来到playground尝试一波:

1
2
3
4
fn main() {
let a = [1, 2, 3, 4];
println!("{}", a.into_iter().reduce(|sum, i| sum + i).unwrap());
}

以上代码在Stable version 1.55.0+2018 Edition下编译不通过,提示如下:

1
2
3
4
5
6
7
8
9
10
11
12
   Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
--> src/main.rs:3:50
|
3 | println!("{}", a.into_iter().reduce(|sum, i| sum + i).unwrap());
| ^^^^^^^
| |
| expected `&{integer}`, found integer
| help: consider borrowing here: `&(sum + i)`

For more information about this error, try `rustc --explain E0308`.
error: could not compile `playground` due to previous error

能看到,这里仍然要求返回值是&{integer}

将工具链改为Nightly version 1.56.0-nightly(我尝试的版本是50171c)+2021 Edition下则编译通过,打印10

那么这里应该怎么写呢?

rust提供了一个类似reduce的函数fold,都是对容器元素从前到后逐个操作,但不同的是fold可以指定初值(和类型),而reduce没有初值。

这就意味着fold中的lambda要求是Fn(T, &i32) -> T,其中T是初值的类型,只要填入一个0就可以完美完成;而reduce中的lambda必须是Fn(&i32, &i32) -> &i32(显然,中间结果的地址没什么意义,所以没办法这么写)。

所以最后的解决方案远比切换到最新的版本和最新的nightly build简单得多:

1
2
3
4
fn main() {
let a = [1, 2, 3, 4];
println!("{}", a.into_iter().fold(0, |sum, ptr| sum + *ptr).unwrap());
}

前两天去游泳的时候,在更衣室里见到了很迫真很廉价的那种鼓励锻炼的沙文主义口号,大概是「我一定要追求强大的存在,即使这种存在注定使我孤独!」之类的。

当时想起了新概念4引用的奥威尔的那篇《the Sport Spirit》,虽然内容不完全记得了,但大意还是有的。

刚刚看到空间和朋友圈对混双赛结果的大量观点激荡,又想起来这个事情。就……感觉奥运精神里加的那个「together」挺扯淡的,翻译成「更团结」就是扯淡加扯淡了。

如果说奥运最初的目的是用体育来「释放」人类彼此的敌意来制止战争的话,那么当代奥运会真的是彻底走到了它的反面:训练运动员的卖力程度比起训练军人可以说是有过之而无不及;观众把比赛胜利视为荣耀、失败视为羞辱。唯一不同的是,单纯被作为「战争兵器」培养的人只存在于影视和动漫作品中,还时常伴随着作者的人文反思;但是没有其他技能的专业运动员则被视为国家荣誉的捍卫者、为万人敬仰。

如果说是要鼓励一般人参与运动呢?我觉得对于很多项目而言也是很可疑的——人们会持续(业余地)参与一门运动,更多还是因为从中找到了自己的乐趣,而非来自偶像的激励作用。而且,我也不会因为侯志慧或者李-基弗夺冠就去参与举重或者击剑这些不太常见的运动。

说这些呢,一个是觉得奥运会其实并没有增进人类的友谊和团结,另一个是觉得这样极度专业化的培养也并不利于人的全面发展——当然,在高度发达的资本主义秩序里,人们都是专业化的,我在这里五十步笑百步,恐怕是贻笑大方了。

2021.7.6,全国各大高校的性别议题相关社团公众号在一瞬间全部被封禁。

我个人能确定的有清华purple、武大性别性向平等研究会、华科HGP。据信各大高校无一幸免。

引用一句朋友的话:

没有原因。为什么需要原因? 你是不稳定因素,这就是原因。 即使你们什么都没做、什么都不是。 问题不在于我们是什么、做了什么,而是他们认为我们是什么、做了什么

为了我们和你们的自由

为了我们和你们的奴役

关于创作一本中国版类Missing Semester在线书籍的想法

为什么要写一本新书?

这个想法在我脑海中已经酝酿了许久,但让我将它正式提出来的契机是这张图片:

cywXhq.jpg

在计算机专业的学习中,我们时常会遇到各种各样的「无关编程的问题」。不管是环境变量PATH的作用、vim编辑器的使用还是Linux系统下可执行文件的扩展名,也包括如何从互联网上寻找问题的答案,都是那些「无关编程的问题」,而且它们往往并不容易从搜索引擎上直接获得答案。

有些时候,遇到这些问题的人会去百度搜索,可能找到一个CSDN链接,点开后里面是另一个CSDN链接,剥了若干层洋葱以后,看到的是一篇博客园十年前的文章——里面的内容可能早已过时,也不能保证解决自己的问题。也有些时候,有幸在大学之前就对计算机有所了解的同学就要遭受“弱智问题”的轰炸,而且常常因为提问者完全缺乏合理提问的常识还不自知等原因感到厌烦,甚至引发不愉快。

因此,我认为,应当有一份资料来帮助解决这个问题。

读者可能要问,不是已经有Missing Semester中文版)了吗?为什么还要再来一本新书?一方面,中国的计算机教育和美国CS教育体系并不相同,因此也出现了很多「中国特色的问题」。譬如在国内大多数院校,往往是计算机相关院系以C++,非计算机相关院系则以C作为程序设计课的语言——这两门语言并不适合入门,它们会牵扯出一系列概念方面、环境配置方面的问题。另一方面,Missing Semester课程中有一些与国内计算机教学不太相关的内容(比如sedawk的使用),同时工作环境限定于Linux系统这一点也劝退了很多想要学习的新人。

因此,我认为,编写一本「具有中国特色的」类Missing Semester在线书籍,是有必要的。

这本书要写哪些内容?

目前还没有明确的大纲,只有一些粗略的想法。在我考虑中的内容有这些:

  • 基于国内网络环境,对于「上网查找答案」提供一些经验性指南

  • 对操作系统基本概念的简要介绍

  • 对C/C++的简要介绍,介绍一些编程语言的基础性概念

  • 对Dev-C++和Visual Studio Code的配置介绍

  • (针对Windows用户)Windows Terminal、Windows Subsystem for Linux等现代工具的入门指南

只写这些内容肯定是不够的,事实上我个人也并没有将这些内容写得足够好的自信。这本书要依赖大家的力量,因此欢迎任何人提出自己的想法。

这本书要怎么写?放在哪里?

目前的想法是用readthedocs/mkdocs或者mdbook撰写,部署在gitee.io上以方便国内同学访问。

如果您有更好的想法,欢迎提出!

这本书由集体贡献,如何保证质量或风格一致性?

目前的想法是由个人提出章节提案,经过讨论同意后由提出者进行撰写,写完后再由另一个人进行审阅。

因为我没有集体维护在线文档的经验,所以这仅仅是一个想法,可能不具备良好运行的可能。如果您有相关的经验而且乐于参与本项目,请不吝赐教!

我对这个企划很感兴趣,我要怎么参与呢?

这是我的邮箱:chuyan-z19@mails.tsinghua.edu.cn

您也可以联系我的QQ:2371576276

最近几天,我在着手用Actix-web重写一遍我们软件工程课的祖传后端小作业:一个基于Django的玩具留言板后端。一方面,这个后端非常成熟,每年助教都会拿出它来、删去一小部分代码,然后给学生来填空,作为一次小作业。另一方面,这个后端也相对完整,虽然没有路由过程中的变量匹配,但是有基本的get、post请求的处理、有数据库交互、有单元测试。

我的想法是在软件工程的大作业里使用Actix-web作为后端框架。我们的大作业项目是一个在线商品交易系统的后端,纯web应用,用Actix-web非常合适。在学习了一段时间的Rust之后,我要一边上手Actix-web,一边向我的队友证明Actix-web可以胜任我们软件工程大作业的需要——在一个难度适中的小工程中做这件事情是最合适的了。因此我开始用Actix重写这个祖传toy后端。

我用了大概两天写完业务逻辑,又用了两天写单元测试。diesel作为一个ORM,和数据库的链接并不很方便,体验远不及Django集成完善的ORM。也由于相同的原因,在Actix中进行单元测试也比较复杂。但把前期的坑一个个踩完了,剩下的就只有平凡无奇的业务逻辑了,并不困难。这四天我的作息不太规律,完全没有动任何作业,花费了几乎所有的时间去写代码、踩了很多的坑然后再一个一个填上。遇到坑的时候很抓狂,但是解决问题之后也很开心。这是我第一次觉得写代码“非常爽”。也正因为如此,我对Actix充满了信心。在第三天晚上我们组内会议的时候,我提名了Actix-web作为后端框架,陈述了它极佳的性能和安全性,但也指出了学习和撰写上的一些困难。可能是因为线上会议的缘故,大家发言并不很积极,也没有对Actix发表太多的意见,初步就定下了这样的方案。

到了第二天组会后,我向后端组的其他两位同学介绍Rust的开发环境安装的时候,事情发生了变化。最开始是说“我们先试一下,如果不行还有Plan B”,然后变成“我觉得这个非常困难,我尝试做一下”,再然后是“统辅不是我最大的问题,我运动队训练占用大量时间”,最后就变成了“我理解你已经在这个框架上花费了大量精力”——我虽然直,但我不傻。话说到这个份上,我完全明白会发生什么了。2vs1,而且我也没有任何的理由来反对一个“可用”的框架Django,毕竟我们小学期学的就是它。

没有任何人做错任何一件事情:队友提出了自己的意见——毕竟我们还没有最终敲定我们的技术栈,而且也没有任何人保证我的提案一定会通过。但我只是觉得心理落差非常大,和之前三天“燃起来了”的感觉完全不同。舍友带领的那个小组对Rust和Actix的包容程度要更好一些,可能因为他们更熟悉、也可能因为舍友作为组长有更强的号召力吧。

事已至此,为了我的成绩和对队友的责任,我也只能把Django的东西拾起来,在后端上尽我的一份力。也算是一次教训吧:在做teamwork之前找到和自己志趣相近的队友,审慎地评估局面。

另附仓库如下:backend-demo

写在前面:

这篇文章是我的朋友上征给清新时报供的一篇稿,今天(2021年3月7日,女生节当天)清新时报在一个非官方、不受领导审核的后门公众号上刊发了“这篇文章”,只不过它的内容已经被修改得面目全非,远非作者原本的意思。

因此,我在征得作者的同意后,将这篇文章的原样发布在自己的博客上。转载请注明原作者。

2021年,我们继续聊一聊“该不该过女生节”

文/溘埃风余上征

​ 又是一年“三·七”将要临近的日子。近年来,随着社会观念的改变、女性权益意识的觉醒、对消费主义批判意识的出现,越来越多的女性打出“反三七,过三八”的旗帜,鼓励女性同胞拒斥女生节/女王节/女神节,而选择过“三·八”国际劳动妇女节。在笔者朋友的实际生活中,即使是平时对“反三七,过三八”并不感冒的女性,也会在“三·七”的各种广告扑面而来时,吐槽一句“整这些女神节有什么用”。但是另一方面,也依然有相当一部分人认为过“三·七”没有什么问题。步入二十一世纪的第三个十年,那就让我们继续来谈一谈,到底该不该过“三·七”女生节?

​ 诚恳地谈,不同的女性面对这个问题的感受确实不同。不能否认,女生节的存在确实一定程度上能带来一些满足感和仪式感。比如校园内每年都会拉起的横幅、比如班级、院系组织的大联欢、比如收到的款式多样的礼物,比如有人买早餐,有人帮忙解数学题……这样的一个节日确实在营造一种氛围,即今天是属于女孩儿的美好节日,女孩们今天是女王、是仙女,可以更有理由去做一些日常生活中不会做的活动,等等。这些的确是不少女性同学所能感触到的内容,而且有许多同学对此颇有好感。而在男生节时,这样的满足感和仪式感按理说也会转移到男性同学身上,男生们则可以是阳刚帅哥、谦谦君子……

​ 然而我们要看到,这些活动的本意或许是给女生带来满足感和仪式感,但并不是说这些活动就完全达到了这样的意思,反而在具体的实践中逐渐固化了一些不像节日那么“美好”的东西。笔者观察了两年来的女生节横幅,在这些横幅上,笔者看到的并不是想象中的对女性的理解与尊重,而依然存在着大量的性别刻板印象以及异性恋“求偶”一样的话语霸权。在不少男生的笔下,女生无外乎是“小仙女”“才女”“淑女”“女神”一类的身份,希望或祝福女生们的特质也无非“温柔”“可爱”“甜美”而已。同时,这种对女生的“称赞”“祝福”的表达,又往往以一种“情话”“情书”“告白”的形式呈现出来:“浪漫”“忠诚”“只爱你一人”“一生只有你”等等。送的小礼品也很能体现一些男生对女生的想象:便宜的可能有毛绒玩具、巧克力,昂贵的则是各种各样的化妆品。男生节也存在着同样的问题,希望男生“阳刚”“帅气”“勇武”,同样也是有意无意地加之于男性的刻板印象。

​ 不仅如此,在这种刻板印象和“求偶”的异性恋想象之外,更令我们对女生节的积极意义动摇的东西是什么呢?女生节当天,女生们可以享受鲜花、掌声与祝福,可这一天过后,女性在社会生活中却依然要面对并未减少的歧视与障碍。对女生送上“温柔”“美丽”的祝福之后,对女性容貌、身材、穿衣打扮的品头论足、指指点点与肆无忌惮的body shame仍然无处不在;这一天的“守护”之后,没有改变的是依然存在的校园、职场性骚扰、职场暴力与家庭暴力;收到了精美的化妆品作为礼物,但容貌焦虑一点都没有减少……当女性仍然在生活中感受到来自现实的系统性歧视和暴力的时候,女生节的浪漫想象和无上地位就显得有些苍白无力。退一步说,即使女生节的横幅、礼物、活动中没有这么多的刻板印象和冒犯,男生们把女生节组织得越华丽、越完美,社会现实就越冰冷、越残酷。

对于不少男性而言,这样的指责可能让他们感到委屈和不公。笔者想指出的是,尽管在女生节里,男生可能付出了比平时百倍甚至千倍的努力去逗女生开心,去宠女生,劳心劳力地完成一个仪式感的东西,但是在日常生活中,部分男性却依然在无所作为中维护着对女性并不友好的社会现实。对于那些可以做的无数的并不需要费什么心思的对女性的尊重、反歧视的行为,真正去做的男生也并没有多少。况且即使是这些麻烦的仪式感的东西,也往往是居高临下地表达对女生的“宠爱”“忠诚”“保护”,女性是弱势的,是需要关照的……而这些东西恰恰是旧的二元性别分工规训的产物,同时又加剧了不平等的社会现实。实际上,男性可以为女性做的事情并没有那么麻烦,并不需要男性付出多大的牺牲(以至于每年都有人吐槽给女生买礼物有多困难),并不需要去“宠”“买早餐”“解数学题”,而可能只是需要在平时的生活中少开一个荤段子,在饭桌上面对其他男性对女性肆意的玩笑表达自己的反感,不对女生的外貌评头论足,等等。这些都是并不需要付出过高的成本和代价,也不需要刻意的准备和排练就能做到的事情,并不会让人感到困难和迷茫。

另外要指出的是,即使设立一个看似“女性操办”的男生节,我们也不禁有这样的疑问:在两个节日之间两性互相“交换礼物、祝福”的“等价交换”的过程中,真的就维护了两性平等吗?反而是在3月7日这一天,女孩被捧上了天,变成了仙女、女王,但之后的日子里却依然遭受着不公正对待,甚至还要单独拿出来一天去“宠”男性,不是更令人感到不适吗?如果真的一定要同时设立男生节和女生节,那么它们存在的意义应该是促进两性相互理解、尊重、包容、消除刻板印象、超越性别规范的鸿沟,而不是在两个日子里把双方各自捧上天,之后生活依旧,女性依然面对挑战,男性依然视若无睹,甚至有的人还要骂上两句“女拳”。

说到底,无论是“三·七”还是“三·八”,必不可少的内核应当是“女性为自己过节”,发出自己的声音,选择自己的未来,而不是由女性之外的什么去决定或者指导。这也是为什么今天我们仍然倡导要过妇女节——作为20世纪国际劳动女性解放运动的纪念日,妇女节从它诞生的一开始就是带有强烈的女性主体性。妇女节是真正属于广大为了自己的权利、社会地位而战斗的女性的节日,是劳动妇女为自己赋权的节日。在妇女节的历史上,没有男性主动的“施舍”与“恩赐”亦或是“宠爱”与“关怀”,而有着的是无数女性主义前辈们的斗争与战斗。今天世界上的妇女能享受到的政治经济文化权利,虽然还没有达到真正的两性平等,与性别歧视和性别规范的斗争还远没有结束,但是也比一百、两百年前的妇女要多得多,而这些正是女性为自己争取而来的真切的权利,并且女性还要继续战斗下去。

篇幅有限,文已至此,读者对于“该不该过三·七”的问题,心中或许有着模糊的认识或者明确的答案,或者也可能认为这篇文章的观点不值一提。但无论如何,值此国际劳动妇女节之际,请允许笔者祝每一位清华园内的女性、世界上的每一位女性节日快乐!

个人闲话

开课一年之后我才知道有这样一门课。知道GAMES是CCF牵头办的这件事之后,心里感觉有点怪怪的,像是一个几十年的老傻逼突然干了人事还干得挺好那种感觉。

笔记比较粗糙,是随听随记的,会持续更新,有没有总体整理我不保证。

作业似乎是不允许分享的,我就不贴了。

阅读全文 »