快手上哪个女的胸最大这个女的ID是多少?

点击阅读原文
对 Rust 语言的分析(更新ing)
日 发布,来源:
对 Rust 语言的分析
Rust 是一门最近比较热的语言,有很多人问过我对 Rust 的看法。由于我本人是一个语言设计专家,实现过几乎所有的语言特性,所以我不认为任何一种语言是新的。一种“新语言”对我来说,不过是把早已存在的语言特性(或者毛病),挑一些出来放在一起。所以一般情况下我都懒得去评论别人设计的语言,甚至懒得去看一眼,除非它历史悠久(比如像 C 或者 C++),或者它的拥鳖们在工作中惹恼了我(像 Go 和 JavaScript 那样)。这就是为什么这些人问我 Rust 的问题,我一般都没有回复,或者一笔带过。
不过最近有点闲情逸致,我想既然有人这么热衷于这种新语言,那我还是稍微凑下热闹,顺便分享一下我对某些常见的设计思路的看法。所以这篇文章虽然是在评论 Rust 的设计,它却不只是针对 Rust,它是针对特定的语言特性,而不是某种语言。
由于我这人性格很难闭门造车,所以现在我只是把这篇文章的开头发布出来,边写边更新。所以你要明白,这只是一个开端,我会按自己理解的进度对这篇文章进行更新。你看了之后,可以隔一段时间再回来看新的内容。如果有特别疑惑的问题,也可以发信来问,我会汇总之后把看法发布在这里。
变量声明语法
Rust 的跟 Scala 和 Swift 的很像。你用
let x = 8;
这样的构造来声明一个新的变量。大部分时候 Rust 可以推导出变量的类型,所以你不一定需要写明它的类型。如果你真的要指明变量类型,需要这样写:
let x: i32 = 8;
在我看来这是丑陋的语法。本来语义是把变量 x 绑定到值 8,可是 x 和 8 之间却隔着一个“i32”,看起来像是把 8 赋值给了 i32……
变量缺省都是不可变的,也就是不可赋值。你必须用一种特殊的构造
let mut x = 8;
来声明可变变量。这跟 Swift/Scala 的 let 和 var 的区别是一样的,只是形式不大一样。
变量可以重复绑定
Rust 的变量定义有一个比其它语言更奇怪的地方,它可以让你在同一个作用域里面“重复绑定”同一个名字,甚至可以把它绑定到另外一个类型:
let mut x: i32 = 1;
let x = // 这两个 x 是两个不同的变量
let y = 4;
// 30 lines of code ...
let y = "I can also be bound to text!";
// 30 lines of code ...
println!("y is {}", y); // 定义在第二个 let y 的地方
在 Yin 语言最初的设计里面,我也是允许这样的重复绑定的。第一个 y 和 第二个 y 是两个不同的变量,只不过它们碰巧叫同一个名字而已。你甚至可以在同一行出现两个 x,而它们其实是不同的变量!这难道不是一个很酷,很灵活,其他语言都没有的设计吗?后来我发现,虽然这实现起来没什么难度,可是这样做不但没有带来更大的方便性,反而可能引起程序的混淆不清。在同一个作用域里面,给两个不同的变量起同一个名字,这有什么用处呢?自找麻烦而已。
比如上面的例子,在下面我们看到一个对变量 y 的引用,它是在哪里定义的呢?你需要在头脑中对程序进行“数据流分析”,才能找到它定义的位置。从上面读起,我们看到 let y = 4,然而这不一定是正确的定义,因为 y 可以被重新绑定,所以我们必须继续往下看。30 行代码之后,我们看到了第二个对 y 的绑定,可是我们仍然不能确定。继续往下扫,30行代码之后我们到了引用 y 的地方,没有再看到其它对 y 的绑定,所以我们才能确信第二个 let 是 y 的定义位置,它是一个字符串。
这难道不是很费事吗?更糟的是,这种人工扫描不是一次性的工作,每次看到这个变量,你都要疑惑一下它是什么东西,因为它可以被重新绑定,你必须重新确定一下它的定义。如果语言不允许在同一个作用域里面重复绑定同一个名字,你就根本不需要担心这个事情了。你只需要在作用域里面找到唯一的那个 let y = ...,那就是它的定义。
也许你会说,只有当有人滥用这个特性的时候,才会导致问题。然而语言设计的问题往往就在于,一旦你允许某种奇葩的用法,就一定会有人自作聪明去用。因为你无法确信别人是否会那样做,所以你随时都得提高警惕,而不能放松下心情来。
另外一个很多人误解的地方是类型推导。在 Rust 和 C# 之类的语言里面,你不需要像 Java 那样写
int x = 8;
这样显式的指出变量的类型,这似乎是一个很方便的东西。然而看过很多 C# 代码之后你发现,var x = 8; 看似方便,却让程序变得不好读。在看 C# 代码的时候,我经常看到一堆的变量定义,每一个的前面都是 var。我没法一眼就看出它们表示什么,是整数,bool,还是字符串,还是某个用户定义的类?我需要把鼠标移到变量上面,让 Visual Studio 显示出它推导出来的类型,可是鼠标移开之后又忘了它是什么。有时候发现看同一片代码,都需要反复的做这件事。很多 C# 程序员为了避免这个问题,开始用很长的变量名,把类型的名字加在变量名字里面去,这样一来反而更加复杂了。所以这种形式的类型推导,看似先进或者方便,其实还不如直接在声明处写下变量的类型,就像 Java 那样。
所以,虽然 Rust 在变量声明上似乎有更灵活的设计,然而我觉得 C 和 Java 之类的语言那样看似死板的设计其实更好。我建议不要使用 Rust 变量的重复绑定,避免使用类型推导,尽量明确的写出类型,以方便读者(大部分时候你的代码的读者是你自己)。
动作的“返回值”
Rust 的文档说它是一种“”的语言,并且给出这样一个例子:
let mut y = 5;
let x = (y = 6); // x has the value `()`, not `6`
奇怪的是,这里变量 x 会得到一个值,空的 tuple,()。这种思路不大对,它是从像 OCaml 那样的语言照搬过来的,而 OCaml 本身就有问题。在 OCaml 里面,如果你使用 print_string,那你会得到如下的结果:
print_string "hello world!\n";;
hello world!
- : unit = ()
这里,print_string 是一个“动作”,它对应语言里面的“statement”。就像 C 语言的 printf。动作通常只产生“副作用”,而不返回值。在 OCaml 里面,为了“理论的优雅”,动作也会返回一个值,这个值叫做 ()。其实 () 相当于 C 语言的 void。C 语言里面有 void 类型,然而它却不允许你声明一个 void 类型的变量。比如你写
int main()
程序是没法编译通过的(试一试?)。让人惊讶的是,古老的 C 的做法其实是正确的,这里有比较深入的原因。如果你把一个类型看成是一个集合(比如 int 是机器整数的集合),那么 void 所表示的集合是个空集,它里面是不含有任何元素的。声明一个 void 类型的变量是没有任何意义的,因为它不可能有一个值。如果一个函数返回 void,你是没法把它赋值给一个变量的。
可是在 Rust 里面,不但动作(比如 y = 6 )会返回一个值 (),你居然可以把这个值赋给一个变量。其实这是错误的作法。原因在于 y = 6 只是一个“动作”,它只是把 6 放进变量 y 里面,这个动作发生了就发生了,它根本不应该返回一个值,它不应该可以出现在 let x = (y = 6); 的右边。就算你牵强附会说 y = 6 的返回值是 (),这个值是没有任何用处的。更不要说使用空的 tuple 来表示这个值,会引起更大的类型混淆,因为 () 本身有另外的,更有用的含义。
你根本就不应该可以写 let x = (y = 6); 这样的代码。只有当你犯错误或者逻辑不清晰的时候,才有可能把 y = 6 当成一个值来用。Rust 允许你把这种毫无意义的返回值赋给一个变量,这种错误就没有被及时发现,反而能够通过变量传播到另外一个地方去。有时候这种错误会传播挺远,然后导致问题(运行时错误或者类型检查错误),可是当它出问题的时候,你就不大容易找到错误的起源了。
这是很多语言的通病,特别是像 JavaScript 或者 PHP 之类的语言。它们把毫无意义或者牵强附会的结果(比如 undefined)到处传播,结果使错误很难被发现和追踪。
未完,待续……
(如果你喜欢这些内容或者想支持这篇文章的书写,请付费5美元或者30人民币,谢谢!)
现已完结。
明天提醒我
我要该,理由是:
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
扫扫下载 App君,已阅读到文档的结尾了呢~~
Rust编程语言核心优势和核心竞争力
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Rust编程语言核心优势和核心竞争力
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口蒋欣低调现身 - 有情怀的匠人
精华博文推荐
【宁顺磊】
【熊光贵】
【袁启会】
人气最旺专家
领域:专题荟萃
介绍:1990年陕西省铜川市69煤台杀人案死者张强上海市哪个火车站离奉贤区四团镇平港路168号最近?...
领域:沙龙
介绍:佛学、大爱、永生、感化、放下屠刀 立地成佛?怎么去蒂屠刀?说明屠刀的历史是比佛更久远?30历史上的武将真能一抵数十人吗?...
nba季后赛得分榜
本站新公告
| 阅读 | 评论
我想把曾经删除的一个好友找回来5谁会弄q头像背景透明的那种png图加下我q,帮我弄,一百qb,急急急,...
| 阅读 | 评论
父母想伤害子女 不出奇啊!子女如何防卫如何胆养?看看我这个需要割包皮吗...
| 阅读 | 评论
怎么样查一个人的电话号码美团外卖送餐员怎么加入需要18岁吗...
| 阅读 | 评论
网易邮箱绑定手机号,生成一个邮箱别名,现在这个别名的邮箱被人注册了苹果ID,期间并没有收到验证激活有个julia编程语言,有用过的吗...
| 阅读 | 评论
其实美国对中国帮助最大,德国次之,而苏俄才是残害中国最深重的国家,为何还有人认贼作父并亲俄经济学家是做什么工作的?...
| 阅读 | 评论
强迫症的人可以结婚吗新浪微博这个标识是什么?...
| 阅读 | 评论
从西城三塔寺到东城三里河公园做什么公交车能到其实美国对中国帮助最大,德国次之,而苏俄才是残害中国最深重的国家,为何还有人认贼作父并亲俄...
| 阅读 | 评论
重庆有做水洗裤的厂服服装厂吗?中山市榄镇车比路有限公司地址...
| 阅读 | 评论
关于C罗和穆里尼奥欧冠,谁有这张图片的高清版吗,谢谢。美团外卖送餐员怎么加入需要18岁吗...
| 阅读 | 评论
iPhone6S。四位数密码忘记了。没指纹没ID也没有打开语音。现在该如何解开手机密码呢!手机58同城怎么删帖退费我朋友问我借了叁万,大写,写了参万,小写少了个零,此借条有效...
| 阅读 | 评论
问问进入武汉麻将提示网络异常怎样处理5我女朋友的高中同学的爸爸想撮合我女朋友和他儿子 现在我们大二 在同...
| 阅读 | 评论
5我女朋友的高中同学的爸爸想撮合我女朋友和他儿子 现在我们大二 在同上海虹桥医院的阴道缩紧治疗好么...
| 阅读 | 评论
100哪位大神能看出这是呼和浩特什么地方,感谢企业和萨拉托加哪个更好...
| 阅读 | 评论
谁有司徒骏文无稽之谈的链接女的96年五月二十九下午四点出生和男的95年四月二十三时间不清楚,求...
| 阅读 | 评论
梦乔传在哪可以看全集?二手G5手机怎么样,网上能买吗?...
友情链接:|||||||||||||||||||||||||||||||||||《编程狂人》第九十期,程序员必看的技术周刊 - 简书
《编程狂人》第九十期,程序员必看的技术周刊
查看周刊详细内容,请移步++++++++++++++++++++++++++++++++++++++++++++++业界新闻前端开发编程语言安卓开发iOS开发后端技术数据存储架构应用技术纵横程序人生技术资料项目工具++++++++++++++++++++++++++++++++++++++++++++++查看周刊详细内容,请移步
推酷专注于IT领域的信息挖掘和推荐,给你全栈式高效阅读体验。

我要回帖

更多关于 快手上那个扮女人的 的文章

 

随机推荐