为何 Swift 里常量是 let? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http:/nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
guoqiao
V2EX    iDev

为何 Swift 里常量是 let?

  •  
  •   guoqiao 2014-06-22 07:41:19 +08:00 11638 次点击
    这是一个创建于 4129 天前的主题,其中的信息可能已经有所发展或是发生改变。
    谁能告诉我这是神马单词的缩写
    第 1 条附言    2014-06-22 17:55:32 +08:00
    其实我真正的疑惑是:
    定义变量是var x, 这很自然.
    但定义常量是let x, 与前面的var放在一起, 就很不和谐.
    一个是名词, 一个是动词, 怎么看, 语法都不一致.
    而苹果一向是一家很注重细节和一致性的公司, 这似乎不像他们的风格.
    因此我才怀疑这里的let是不是神马我不知道的高深单词的缩写.

    回答里很多同学在解释用let定义常量的合理性,对此我没有异议.
    我关注的是为什么它和var的语法风格不一致.
    好吧, 这本质上是个无关痛痒的问题, 但很高兴还是有很多人给出了有价值的解释, 至少让这个不一致看起来合理了一些:)
    37 条回复    2020-10-07 00:06:39 +08:00
    snachx
        1
    snachx  
       2014-06-22 07:46:27 +08:00 via Android
    let a =1, 大概就是让a等于1吧…,没啥缩写
    casparchen
        2
    casparchen  
       2014-06-22 07:47:03 +08:00 via iPad
    这难道不是 让 的意思么。让pi这个符号等于3.14
    let pi = 3.14 ?
    ffffwh
        3
    ffffwh  
       2014-06-22 07:49:07 +08:00
    数学课上有没有听过“令x=***”,就是这个let。
    这个常量更接近于functional programming的“XX量”,而不是C家族的const。
    Zhang
        4
    Zhang  
       2014-06-22 07:49:44 +08:00
    BASIC里面用let定义变量。
    limuxy
        5
    limuxy  
       2014-06-22 07:50:09 +08:00
    木有缩写 就是自然语言 (话说这是新语言的趋势吗?越来越接近自然语言?
    skybr
        6
    skybr  
       2014-06-22 07:50:48 +08:00
    就是let的let吧

    至于为什么用let, 开个玩笑. 其他像scala的地方已经很多了, 不好意思再用val, 就再从rust那边摘点喽.
    WildCat
        7
    WildCat  
       2014-06-22 07:58:09 +08:00
    let
    英 [let] 美 [lt]
    允许,任由; 让,随; 假设; 出租
    sanddudu
        8
    sanddudu  
       2014-06-22 08:03:17 +08:00
    let it go
    shippo7
        9
    shippo7  
       2014-06-22 08:07:31 +08:00
    Swift不再需要定义变量的属性(int,double,char之类的),用let占位置了,同时将代码趋近于自然语言
    jsonline
        10
    jsonline  
       2014-06-22 08:25:11 +08:00 via Android
    语法还有为什么么?
    riaqn
        11
    riaqn  
       2014-06-22 08:28:50 +08:00
    lisp里赋值就是let。
    黑客与画家里面说:越是新的语言,就越是接近lisp。
    guoqiao
        12
    guoqiao  
    OP
       2014-06-22 08:33:18 +08:00
    @snachx
    @ffffwh

    谢谢, 你们的这个说法应该是解答了我的疑问.
    guoqiao
        13
    guoqiao  
    OP
       2014-06-22 08:42:10 +08:00
    把let解释成数学里的"令"固然可以说得通, 但把它和var放在一起对比, 就觉得很不和谐, 类似的定义, 完全不同的语义. 这也是我有点疑惑的原因.
    目前来说, swift这门语言给我的感觉, 谈不上很好, 有东拼西凑的感觉, 语法不够精炼, 而且作者对代码的taste并不是很好.
    但无论如何, 至少比objc要强不少.
    eriale
        14
    eriale  
       2014-06-22 09:06:44 +08:00
    lisp中给变量赋值就是let。
    lisp中表达式第一个符号基本上都是动词,赋值也是表达式,我估摸着为了统一风格,就用let作为赋值表达式的第一个符号。
    guoqiao
        15
    guoqiao  
    OP
       2014-06-22 09:29:23 +08:00
    @eriale 嗯, lisp这种做法自然是很赞的.
    但在Swift里, 定义变量是var, 名词.
    而到了定义常量, let, 是动词.
    况且, let没有一点点定义"常量"的含义在里面, 只是生硬的把别的语言里定义变量的关键词拿过来, 用来定义常量.
    这对编程语言的语法优雅与否十分敏感, 所以这个地方让我有点想吐槽.
    binux
        16
    binux  
       2014-06-22 09:42:51 +08:00   2
    @guoqiao
    如果你这么看:

    variable a, b, c;
    let d = 1;

    variable 不需要赋初值,如果只是声明,没必要用动词。赋初值只是附加功能
    let 在有些语言中是就是变量,即使是有些同样有 var 的语言中。只能说就是这么定的,不然你要用

    let const d = 1 吗?
    binux
        17
    binux  
       2014-06-22 09:43:40 +08:00
    更正:
    不赋初值需要指定类型
    superbear
        18
    superbear  
       2014-06-22 10:06:16 +08:00
    lua
    Perry87
        19
    Perry87  
       2014-06-22 10:48:38 +08:00 via iPhone
    对于强制类型转换,象 Int 转 String ,语法是 String(var) ,当 Optinal String 转 Int 又是 var.ToInt?

    另外象 String 和 Array 的计数,一个是用括弧传参数,一个又是用点运算符传消息。
    love
        20
    love  
       2014-06-22 11:14:11 +08:00
    let没有值不变的意思吧?为什么不用const呢。
    hongdengdao
        21
    hongdengdao  
       2014-06-22 12:01:24 +08:00
    scala党表示很淡定,哈哈
    tabris17
        22
    tabris17  
       2014-06-22 12:13:08 +08:00
    @love const只能用常理表达式来初始化

    let的意思是该值赋值后不能更改,immutable的意思
    ipconfiger
        23
    ipconfiger  
       2014-06-22 12:15:27 +08:00
    抠字眼有意思么?
    notcome
        24
    notcome  
       2014-06-22 13:32:15 +08:00
    我看不出有何不妥,数学上也是 let sth = expr,只是接下来 sth 没有发生变化罢了
    caoz
        25
    caoz  
       2014-06-22 14:45:17 +08:00
    And God said, "Let there be light," and there was light.
    akfish
        26
    akfish  
       2014-06-22 14:53:32 +08:00
    po主想象力真丰富,居然认为let是缩写

    多看点英文版的数学类文献吧。

    A Guide to Writing Mathematics
    http://www.cs.ucdavis.edu/~amenta/w10/writingman.pdf
    见第10页:Dening variables and formulas
    lyazure
        27
    lyazure  
       2014-06-22 14:58:28 +08:00 via Android   1
    @guoqiao 你需要rust语言,哈哈, let同样表示赋值后不可变,而定义可变的变量用的是let mut, 其中mut是指mutable可变的。

    swift尝试抄各种语言优点于一身,比如rust, haskell, ruby等,这是作者都承认的,但要融合这些语言优点的同时又实现语言设计理念的纯粹和一致性也是不容易的,swift做得还算不错了。

    站在llvm和jvm的肩膀上,现在要设计实现一门语言已经很容易了,以后新出现的语言理念会越来越先进,语法也会优美,每个人都能找到自己喜欢的语言的,哈哈
    akfish
        28
    akfish  
       2014-06-22 15:01:38 +08:00
    在数学里,被let定义过后的东西,一般不会再次被定义/赋值,在代码里对应的就是常量。
    不要被标题里"defining variables"给迷惑了,数学里关心的是关系/性质,而不是值。所以这是说把一个符号定义为变量,这个符号作为变量的性质在定义过后一直是一个常量。

    至于var,当然是variable的缩写。所以let和var的区分并无不妥。
    Seita
        29
    Seita  
       2014-06-22 16:16:22 +08:00 via iPhone
    let 表示命令,命令带有不可更改的意思 XD
    lsylsy2
        30
    lsylsy2  
       2014-06-22 17:22:42 +08:00
    @Zhang 第一反应也是basic
    ioth
        31
    ioth  
       2014-06-22 17:31:59 +08:00
    basic,第一门学习的语言,快30年了。
    guoqiao
        32
    guoqiao  
    OP
       2014-06-22 17:38:24 +08:00
    谢谢各位的解答, 有一些答案很有价值.但总体说来,我对这个问题的结论是:
    1. 语言的作者就是拿来主义, 直接从别的语言借鉴了比较常用的let关键字,用以区分var. 无他.
    2. var和let摆在一起, 是杂糅的风格, 不和谐, 但也无关痛痒.
    3. 一些相关的解释能让它的存在看起来更合理一些,但无法改变Swift拼凑语法的事实.

    谢谢楼上各位耐心给出解释的大牛!
    guoqiao
        33
    guoqiao  
    OP
       2014-06-22 17:39:18 +08:00
    @binux 嗯, 这个解释很有深度. 谢谢!
    jiang42     34
    jiang42  
       2014-06-22 18:20:55 +08:00
    haskell 的语法
    s51431980
        35
    s51431980  
       2014-06-23 01:02:47 +08:00
    怎么没人提scala中的变量定义是var,常量定义是val(value缩写),这应该满足楼主的和谐

    Swift和ObjC都不是优雅的语言,但是赚钱的语言
    williamx
        36
    williamx  
       2014-07-01 19:55:36 +08:00
    Swift 的语法在我看来就是坨大便但又有什么关系呢?
    bushnerd
        37
    bushnerd  
       2020-10-07 00:06:39 +08:00
    @akfish 终于明白了,这个回答不错。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5957 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 02:47 PVG 10:47 LAX 19:47 JFK 22:47
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86