首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala程序员--“应该有一种显而易见的方法来完成它”,还是“一种以上的方法”?

Scala程序员--“应该有一种显而易见的方法来完成它”,还是“一种以上的方法”?
EN

Stack Overflow用户
提问于 2010-02-05 15:11:28
回答 6查看 1.2K关注 0票数 16

我做Java已经很长时间了,大约6个月前就开始使用Scala了。我喜欢这种语言。有一件事,我发现,有多种方法来做事情。我不知道这是因为语言的本质,还是因为它还很年轻,还在不断发展,习语和最佳实践还没有出现。

令我惊讶的是,我一直是perl用户的python,在这里:

“应该有1,最好只有一种--很明显的办法。”

对我来说比

“有不止一种方法可以做到这一点”。

我很想知道你认为Scala在这个比例上适合什么地方,为什么呢?

引号:Python PEP20Perl引号

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-02-05 16:06:12

我对Scala的经验是,有不止一种方法来做事情,但是很少有“最好”的方法来做事情。库对于以不同的方式处理事情几乎没有多余的选择;当它这样做时,通常是为了在某些情况下提供额外的表现力、紧凑性或效率。

例如,如果您想要对一个整数数组进行求和,您可以完全按照过程处理,这将生成尽可能快的代码,而代价是有点笨重--但如果这是非常耗时的代码,这是解决问题的唯一最佳方法:

代码语言:javascript
复制
val array = Array(1,2,3,4,5)
var sum = 0
var index = 0
while (index < array.length) {
  sum += array(index)
  index += 1
}
sum

在使用原语时,也有同样比较慢的一般功能方法(在2.8中使用@专用可能会发生变化),但只剩下较少的单调乏味:

代码语言:javascript
复制
var sum = 0
Array(1,2,3,4,5).foreach(x => sum += x)
sum

然后,有一些稍微不那么通用的函数构造,它们只是针对这类问题而设计的(因为它经常出现),如果您想要干净、紧凑的代码,这是“最好的”:

代码语言:javascript
复制
Array(1,2,3,4,5).reduceLeft( _ + _ )

有时会有非常非一般的构造来做您想做的事情;例如,在Scala2.8中:

代码语言:javascript
复制
Array(1,2,3,4,5).sum

因此,你得到了一个连续的选择,在一般的力量,紧凑,清晰和速度的权衡。如果您可以假设代码只需要对熟悉Scala的人访问,并且您知道您是否需要绝对最好的性能,那么好的选择通常是相当有限的。但是,由于语言和图书馆的表现力,通常有许多不太理想的方式来做事情。

票数 20
EN

Stack Overflow用户

发布于 2010-02-05 15:33:28

Scala是一个包含许多不同哲学和设计方法的多范式语言。其中包括

  • 目标定向
  • 功能程序设计
  • Java专用方法
  • 面向语言的编程(扩展语法、元编程)

这允许程序员从许多不同的角度来解决问题,因此可以以许多方式解决问题。正如你所怀疑的,这就是语言的本质(就像其他通用/多范式语言一样)。

使用哪一个在很大程度上取决于程序员,尽管我可以给出一些一般规则/想法:

  • Scala毕竟是一种函数式语言。因此,我认为遵循函数式编程是一种很好的做法(这也将导致非常简洁和优雅的解决方案)。
  • 保持一致!,毕竟,应该有为您提供的一种方式,但是您可以选择哪一个。避免将副作用和纯函数、列表理解和库函数(地图、过滤器)或Java与功能思维混合在一起.相反,在不同的范例最好的地方使用不同的范例。
  • 使用Scala为您提供的出色功能(而不仅仅是将其用作具有良好语法的Java ):模式匹配、延续、泛型和非常强大的类型系统、高级函数。
票数 5
EN

Stack Overflow用户

发布于 2010-02-05 20:08:35

Scala绝对是一种多方面的语言。特别是,因为它是一种高度正交的语言,只有尽可能少的例外,并且通过库而不是语言本身提供尽可能多的服务。

正交意味着语言特征不是相互依存的。相反,它们可以自由地结合起来,以达到任何目的。这给了语言更多的表现力--并且使语言更简单--但是它肯定不会通过强制使用一种首选的方式,或者通过拒绝可疑价值的组合来“引导”程序员。

很少有例外主要是高正交性的结果。Scala中的东西是不允许的,因为它们没有意义(从设计者的角度来看)或者是次优的。

最后,强调图书馆。Scala没有列表或地图。而数组之所以指定是因为与Java的互操作性要求它这样做。从这个意义上说,它很像C,而不是BASIC。在C语言中,除了数学之外,您所做的几乎所有事情都是通过库完成的,它们要么用C本身编写,要么用汇编程序编写。在基本情况下,甚至连打开文件或在屏幕上显示文本之类的命令也是语言本身的一部分。

这有两个实际后果。首先,有一种趋势,就是有许多职责重叠的图书馆。当然,对于任何具有强大的库生态系统的语言来说,这都是正确的,但是,在Scala中,这些库看起来像语言本身的一部分;

另一个实际的结果是,基库需要一定的灵活性,这在它们之间产生了一定的冗余。

例如,List有一个附加运算符(在Scala2.8上),尽管这对列表来说不是最优的。它是这样的,因为List是一个Seq,而这是一个人们可能想要对它们执行的一般操作。

作为最后的说明,语言的多个单向特性可以从函数和面向对象编程的结合中看到。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2208140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档