为什么Scala支持具有针对每个定义的表达式的多名称定义?
对于大多数语言,我不会问“他们为什么这样做X?”因为它通常基于意见.
对于像C这样的语言,通常的答案是引用一些规范,并且所有人都可以说是有人在做出特定选择之前可能认为很长很难(但可能做出了不同的选择). Scala是不同的 – 通常答案是指出你可以用一些更简单的结构Y和Z来思考X,因此在这种情况下看X的表达是有意义的. 因此,我会问为什么Scala允许定义引入多个名称并为每个名称计算一次给定的表达式? 如果你让Java程序员猜测这里会发生什么,他们可能会猜错: var x,y,z = 3 即他们猜测只有z被分配了一个值. 如果你解释val然后告诉他们以下是合法的: val x,z = 3 然后他们可能会猜测正在进行更多操作,因为在此行之后x和y必须具有值,因为它们以后不能被赋予不同的值. 他们可能会假设x和y为其类型采用默认值,例如0表示整数,但由于这里没有明确的类型,这是一个飞跃. 他们可能会认为它被处理为: val z = 3 val x = z val y = z 当=左边的表达式产生原始值或不可变对象时,这并不重要.但以下可能会让他们怀疑: val x,z = new StringBuilder 为什么有人想为同一个StringBuilder实例引入三个名字? 如果你向他们展示了以下内容,他们可能会从构造中猜出,甚至在运行代码之前出现了奇怪的事情: var i = 0 def f: Int = { i += 1 println(i) i } val x,z = f 最终人们意识到,似乎只与z关联的表达式实际上是针对每个名称评估一次,即上述内容相当于: val x = f val y = f val z = f 那么谈论习惯于另一种语言的程序员可能会想到什么呢? 大多数人从其他地方来到像Scala这样的语言,所以除非有充分的理由,否则应该避免可能混淆的程度结构. 乍一看,这个功能似乎没有提供太多,它避免了你不得不重复自己,但为这么小的收益添加这片相当混乱的语法糖似乎很奇怪. 那么在某种情况下它会带来真正的好处吗?或者这里没有真正的收益,例如我们与其他地方建立的更广泛的模式保持某种逻辑一致性? 解决方法
有一种情况是使用这个令人惊讶的功能:定义scala.Enumeration:
object Weekday extends scala.Enumeration { val Monday,Tuesday,Wednesday,Thursday,Friday = Value } 它调用Value(一个从Enumeration继承的def)5次,枚举的每个字段一次.实际上,这为每个字段分配了一个新的Enumeration#Value实例,这显然是枚举有用的必要条件. 如果没有这个多任务功能,您必须写: object Weekday extends scala.Enumeration { val Monday = Value val Tuesday = Value val Wednesday = Value val Thursday = Value val Friday = Value } 我从未见过在其他任何地方使用的多重赋值功能,但在Enumeration声明中. 在语言设计方面这是否是一个好主意是一个主观问题,而且SO不是讨论它的正确位置. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Docker在Ubuntu 14.04.4 LTS上使用apt-get从v1.11升级到v1.
- 什么是|| :在这个来自rpm spec文件的bash脚本行吗?
- 为什么Scala中的groupBy会更改列表项的顺序?
- bootstrap datetimepicker 日期控件清空问题
- HDU - 5730 Shell Necklace CDQ分治+fft
- 通过Bash中的目录
- debugging – bash:debug选项和函数
- bash – 为什么通配符在`sudo rm`语句中不起作用?
- angularjs – 无法减少ng-repeat中的观察者数量
- scala – Elasticsearch-Hadoop库无法连接到docker容器