【问题标题】:What does ":=" do?“:=”有什么作用?
【发布时间】:2011-07-17 17:05:47
【问题描述】:

我在几个代码示例中看到过:=,但从来没有附带解释。在不知道它的正确名称的情况下谷歌它的使用是不可能的。

它有什么作用?

【问题讨论】:

  • 用什么语言?
  • 您通常在定义某些内容时使用:=,将其与常规变量更改区分开来。我们在谈论什么编程语言?
  • PL/SQL 用于赋值。但考虑到不同的语言,不能保证这个答案是正确的——那么这个例子是哪些语言的?
  • 要在谷歌上搜索类似这样的内容,请将其拼写出来并用引号引起来,例如:“冒号等于”
  • 我认为 Pascal 有这个运算符!

标签: operators colon-equals


【解决方案1】:

http://en.wikipedia.org/wiki/Equals_sign#In_computer_programming

在计算机编程语言中,等号通常表示用于测试值相等性的布尔运算符(例如在 Pascal 或 Eiffel 中),这与符号在数学中的用法一致,或者表示赋值运算符(例如在 C类语言)。做出前一种选择的语言通常使用冒号等号 (:=) 或 ≔ 来表示它们的赋值运算符。做出后一种选择的语言通常使用双等号 (==) 来表示其布尔相等运算符。

注意:我是通过搜索colon equals operator找到的

【讨论】:

  • 具有讽刺意味的是,当搜索 colon equals operator 时,这个答案现在在维基百科上方。
  • 如果我们继续输入 colon equals operator,我们会在 Google 的 SEO 上施展魔法,以使其成为最佳结果
  • 那个链接看起来很旧。这是更新的链接(我认为),但从那时起报价似乎发生了巨大变化,我无法准确找到新报价:en.wikipedia.org/wiki/Assignment_(computer_science)
【解决方案2】:

它是 Pascal 中的 赋值运算符,经常用于证明和伪代码。与 C 方言语言中的 = 相同。

从历史上看,计算机科学论文使用= 进行相等比较,使用 进行分配。 Pascal 使用:= 代替难以键入的左箭头。 C 走了一个不同的方向,而是决定使用 === 运算符。

【讨论】:

    【解决方案3】:

    在静态类型语言中Go:= 是一步完成的初始化和赋值。这样做是为了允许在编译语言中创建类似解释的变量。

    // Creates and assigns
    answer := 42
    
    // Creates and assigns
    var answer = 42
    

    【讨论】:

      【解决方案4】:

      编程语言世界之外的另一种解释来自 Wolfram Mathworld 等人:

      如果 A 和 B 在定义上相等(即,A 被定义为 B),那么这象征性地写成 A=B、A:=B,或者有时是 A≜B。

      http://mathworld.wolfram.com/Defined.html

      https://math.stackexchange.com/questions/182101/appropriate-notation-equiv-versus

      【讨论】:

        【解决方案5】:

        某些语言使用:= 作为赋值运算符。

        【讨论】:

        【解决方案6】:

        在很多 CS 书籍中,它被用作赋值运算符,以区别于相等运算符 =。但是,在许多高级语言中,赋值是=,相等是==

        【讨论】:

          【解决方案7】:

          许多编程语言,尤其是 PascalAda,使用冒号后跟等号 (:=) 作为 assignment operator,以区别于单个等号,后者是等号测试(C 使用单个等号作为赋值,使用双等号作为相等测试)。

          参考:Colon (punctuation)

          【讨论】:

            【解决方案8】:

            这是赋值运算符的旧(帕斯卡)语法。它会像这样使用:

            a := 45;
            

            它也可能是其他语言,可能用途相似。

            【讨论】:

              【解决方案9】:

              这就像一个没有使用小于号的箭头

              在数学中,它类似于等号,但 A := B 表示 A 被定义为 B,三连杆等号可用于表示它在定义上相似且相等,但并不总是相同。

              无论如何,我指出了这些其他参考资料,这些参考资料可能在发明它的人的脑海中,但实际上只是平面等于而不是等于被采用(或可能容易与 =

              历史参考:我第一次看到这个是在 SmallTalk 的原始对象语言中,Apple 的 SJ 只是复制了 Windows 部分,而微软的 BG 则进一步淡化了它们(单线程)。最终,NeXT 中的 SJ 从 Xerox PARC 中吸取了第二个更重要的教训,即成为 Objective C。

              不管怎样,他们只是从 ALGOL 1958 中取了冒号等于运算符,后来被 Pascal 推广

              https://en.wikipedia.org/wiki/PARC_(company)

              https://en.wikipedia.org/wiki/Assignment_(computer_science)

              赋值通常允许一个变量在 在其生命周期和范围内的不同时期。然而,有些 语言(主要是严格功能)不允许那种 “破坏性”重新分配,因为它可能意味着非本地的更改 状态。 目的是加强参考透明度,即功能 不依赖于某些变量的状态,但产生 对于给定的一组参数输入在任何点的相同结果 时间。

              https://en.wikipedia.org/wiki/Referential_transparency

              【讨论】:

                【解决方案10】:

                对于 VB.net,

                一个构造函数(对于这种情况,Java 中的 Me = this):

                Public ABC(int A, int B, int C){
                Me.A = A;
                Me.B = B;
                Me.C = C;
                }
                

                当您创建该对象时:

                new ABC(C:=1, A:=2, B:=3)
                

                那么,不管参数的顺序如何,那个 ABC 对象都有 A=2, B=3, C=1

                所以,是的,这是其他人有效阅读您的代码的好习惯

                【讨论】:

                  【解决方案11】:

                  Python 中:

                  命名表达式 (NAME := expr) 是在 Python 3.8 中引入的。它允许在当前正在评估的表达式中分配变量。 冒号等于运算符 := 有时被称为海象运算符,因为它看起来像一个海象表情符号。

                  例如:

                  if any((comment := line).startswith('#') for line in lines):
                      print(f"First comment: {comment}")
                  else:
                      print("There are no comments")
                  

                  如果您将:= 换成=,这将无效。请注意命名表达式周围的附加括号。另一个例子:

                  # Compute partial sums in a list comprehension
                  total = 0
                  values = [1, 2, 3, 4, 5]
                  partial_sums = [total := total + v for v in values]
                  # [1, 3, 6, 10, 15]
                  print(f"Total: {total}")  # Total: 15
                  

                  请注意,变量total 对理解而言不是本地的(第一个示例中的comment 也是如此)。命名表达式中的 NAME 不能是表达式中的局部变量,因此,例如,[i := 0 for i, j in stuff] 将是无效的,因为 i 是列表解析的局部变量。

                  我从 PEP 572 文档中获取了一些示例 - 值得一读!一旦我的公司从 Python 3.6 升级,我期待使用命名表达式。希望这对您有所帮助!

                  来源:Towards Data Science ArticlePEP 572

                  【讨论】:

                    【解决方案12】:

                    冒号等于在 Algol 及其后代(如 Pascal 和 Ada)中使用,因为它与 ASCII 与左箭头符号一样接近。

                    使用等号进行赋值和使用双等号进行比较的奇怪约定是从 C 语言开始的。

                    在 Prolog 中,赋值和相等测试没有区别。

                    【讨论】:

                    • 如果他们希望它靠近左箭头,他们可以像 Haskell 一样使用<-。他们并没有尝试使用:= 靠近左箭头,而是使用数学“定义为”运算符:mathworld.wolfram.com/Defined.html
                    • 学徒警告:
                    • @Michael 够公平的。你说得对。我的错。无论如何,关键是如果他们试图模仿左箭头,他们不会使用:=,他们会使用<-
                    猜你喜欢
                    • 2023-04-10
                    • 2014-09-13
                    • 2011-12-30
                    • 1970-01-01
                    • 2019-04-26
                    • 2016-04-29
                    • 2017-03-02
                    • 2012-10-04
                    • 1970-01-01
                    相关资源
                    最近更新 更多