- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
C++ 中的运算符重载被许多人认为是一件坏事(tm),并且在新的语言中不应该重蹈覆辙。当然,这是在设计 Java 时特别放弃的一项功能。
现在我已经开始阅读 Scala,我发现它看起来非常像运算符重载(虽然从技术上讲,它没有运算符重载,因为它没有运算符,只有函数)。但是,它似乎与 C++ 中的运算符重载在性质上没有什么不同,我记得运算符被定义为特殊函数。
所以我的问题是,是什么让在 Scala 中定义“+”的想法比在 C++ 中更好?
最佳答案
C++ 从 C 继承了真正的蓝色运算符。我的意思是 6 + 4 中的“+”非常特殊。例如,您无法获得指向该 + 函数的指针。
另一方面,Scala 没有这种方式的运算符。它只是在定义方法名称方面具有很大的灵 active ,加上一些非单词符号的内置优先级。所以从技术上讲,Scala 没有运算符重载。
无论你想怎么调用它,运算符重载本质上都不是坏事,即使在 C++ 中也是如此。问题是当糟糕的程序员滥用它时。但坦率地说,我认为剥夺程序员滥用运算符重载的能力并不能解决程序员可以滥用的所有问题。真正的答案是指导。 http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
不过,C++ 的运算符重载与 Scala 灵活的方法命名之间存在差异,恕我直言,这使得 Scala 的可滥用性和可滥用性都降低了。
在 C++ 中,获得 in-fix 表示法的唯一方法是使用运算符。否则,您必须使用 object.message(argument) 或 pointer->messsage(argument) 或 function(argument1, argument2)。因此,如果您想在代码中使用某种 DSLish 风格,那么就会有使用运算符的压力。
在 Scala 中,您可以通过任何消息发送获得中缀符号。 “对象消息参数”完全可以,这意味着您不需要使用非单词符号来获得中缀符号。
C++ 运算符重载本质上仅限于 C 运算符。再加上只能使用运算符的限制,这给人们施加了压力,试图将广泛的不相关概念映射到相对较少的符号上,如“+”和“>>”
Scala 允许使用大量有效的非单词符号作为方法名称。例如,我有一个嵌入式 Prolog-ish DSL,您可以在其中编写
female('jane)! // jane is female
parent('jane,'john)! // jane is john's parent
parent('jane, 'wendy)! // jane is wendy's parent
mother('Mother, 'Child) :- parent('Mother, 'Child) & female('Mother) //'// a mother of a child is the child's parent and is female
mother('X, 'john)? // find john's mother
mother('jane, 'X)? // find's all of jane's children
:-、!、? 和 & 符号被定义为普通方法。仅在 C++ 中 & 是有效的,因此尝试将此 DSL 映射到 C++ 将需要一些已经唤起非常不同概念的符号。
当然,这也为 Scala 带来了另一种滥用。在 Scala 中,您可以根据需要命名方法 $!&^%。
对于其他语言,如 Scala,可以灵活地使用非单词函数和方法名称,请参阅 Smalltalk,其中,如 Scala,每个“运算符”只是另一个方法,而 Haskell 允许程序员定义优先级和固定性灵活命名的函数。
关于c++ - 是什么让 Scala 的运算符重载 "good",但 C+ +'s "不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1098303/
非常简单的应用程序 - 您可以复制 - 粘贴 - 运行。主要只是“创建”应用程序。 - 这不是问题(可能) #include #include #include #include typede
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
Haskell 有一个名为 seq 的神奇函数,它接受任何类型的参数并将其简化为弱头范式 (WHNF)。 我读过一些资料[但我现在不记得他们是谁了...],它们声称“多态 seq 很糟糕”。他们在哪些
我正在编写一个脚本,该脚本应该在一堆服务器周围运行并从中选择一堆数据,包括本地服务器。选择我需要的数据所需的 SQL 非常复杂,所以我正在编写一种临时 View ,并使用 OPENQUERY 语句来获
考虑以下代码: case class Vector3(var x: Float, var y: Float, var z: Float) { def add(v: Vector3): Unit =
我正在读这个SO post关于守护线程,答案底部的引述是: But joining a demonized thread opens most likely a whole can of troubl
在阅读有关 Google webtool 工具包的内容时,看到一条声明说“同步 RPC 不好”。他们有什么理由吗?我能想到的一个很好的理由是,对最终用户的响应可能会受到远程服务器延迟或网络问题的影
我有以下 HTML: A Simple Sample Web Page By Sheldon Brown Demonstrating a few HTML feat
我正在做一项简单的任务,但我陷入困境...... output 我需要使第一行与其他所有内容保持一致,但无论我做什么,它都不想接受空格。那么,我应该纠正什么以及为什么?谢谢 public static
我在系统中有一个类,其目的列为“这可以是从午夜算起的秒数。或者带有日期的时间。”我试图解释这有多糟糕,但我无法理解我的观点。有没有人对如何解决这个问题有任何想法。 http://code-slim-j
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: When are C++ macros beneficial? Why is #define bad and
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
始终建议通过将所有代码放在 JS 文件中来避免内联 Javascript 代码,该文件包含在所有页面中。我想知道,这是否不会导致繁重的页面出现性能问题。 例如,假设我们有几十个这样的函数 functi
我主要在 AngularJS 中进行开发,最近我正在研究 Vue.js 并阅读它的指南,在它提到的一页上: By default, all props form a one-way-down bind
我正在构建一个本地化目录,但遇到了设计难题。现在,目录存储一个 Dictionary存储翻译,其中 IString可以是两种类型:Singular或 Plural .这是 IString 的简化版本:
对于我的矩阵类,我做了: template class Matrix { private: std::array, Height> Elements; stat
MSDN documentation说 public class SomeObject { public void SomeOperation() { lock(this) {
建议不要在 Python 中使用 import *。 谁能分享一下原因,这样我下次就可以避免了? 最佳答案 因为它会将很多东西放入您的命名空间(可能会影响之前导入的一些其他对象,而您不会知道它)。 因
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
G'day, 这与my question on star developers有关并到 this question regarding telling someone that they're wri
我是一名优秀的程序员,十分优秀!