scala中的所有东西都是函数或表达式或对象吗?

时间:2012-04-05 03:46:39

标签: scala

我很困惑。

我认为一切都是表达式,因为语句返回一个值。但我也听说scala中的所有内容都是一个对象。

现实中是什么?为什么scala选择以某种方式做到这一点?这对scala开发人员意味着什么?

3 个答案:

答案 0 :(得分:15)

  

我认为一切都是表达式,因为语句返回一个值。

有些东西没有价值,但在大多数情况下,这是正确的。这意味着我们基本上可以放弃Scala中“statement”和“expression”之间的区别。

然而,术语“返回值”并不合适。我们说一切都“评估”到一个值。

  

但我也听说scala中的所有内容都是一个对象。

这与之前的语句完全不矛盾:)它只是意味着每个可能的都是一个对象(因此每个表达式都会计算一个对象)。顺便说一下,作为Scala中的一等公民的功能也是对象。

  

为什么scala选择以某种方式做到这一点?

必须注意的是,这实际上是Java方式的一般化,其中语句和表达式是不同的东西,而不是一切都是对象。你可以将每一段Java代码翻译成Scala而不需要很多改编,但不是相反的。因此,这个设计决策使Scala在简洁性和表现力方面实际上更强大

  

这对scala开发人员意味着什么?

这意味着,例如:

  • 您通常不需要return,因为您可以将返回值作为方法中的最后一个表达式
  • 您可以利用ifcase是表达式来缩短代码的事实

一个例子是:

def mymethod(x: Int) = if (x > 2) "yay!" else "too low!"

// ...
println(mymethod(10))  // => prints "yay!"
println(mymethod(0))   // => prints "too low!"

我们还可以将这样的复合表达式的值赋给变量:

val str = value match {
            case Some(x) => "Result: " + x
            case None    => "Error!"
          }

答案 1 :(得分:6)

这里的区别在于断言“一切都是表达式”是关于代码块的,而“一切都是对象”正在制作关于程序中的值。


代码块

在Java语言中,有表达式语句。也就是说,代码的任何“块”都是 表达式一个语句;

//the if-else-block is a statement whilst (x == 4) is an expression
if (x == 4) {
    foo();
}
else {
    bar();
}

表达式有类型;陈述没有;语句被调用纯粹是因为它们的副作用

在scala中,每个代码块都是一个表达式;也就是说,它有一个类型:

if (x == 4) foo else bar //has the type lub of foo and bar

这非常重要!我不能强调这一点;这是让scala很愉快的事情之一,因为我可以为表达式赋值。

val x = if (x == 4) foo else bar

按价值,我的意思是我们可能会在程序中引用:

int i = foo(); //i is a reference to a value
java.util.TimeUnit.SECONDS;

在Java中,上面的i不是一个对象 - 它是一个原始的。此外,我可以访问SECONDS的字段TimeUnit,但TimeUnit也不是对象;它是静态(因为缺少更好的短语)。在斯卡拉:

val j = 4
Map.empty

语言而言,j是一个对象(我可以向它发送方法),就像Map一样 - 模块(或伴随对象) )对于scala.collection.immutable.Map类型。

答案 2 :(得分:6)

  

scala中的所有内容都是函数或表达式或对象吗?

没有。

有些东西不是对象。例如课程,方法。

有些东西不是表达式。例如class Foo { }是一个声明,不会评估任何值。 (这与上面基本相同。)

有些东西不是功能。我不需要提及任何示例,因为任何Scala代码都会有很多看法。

换句话说,“一切都是X”只不过是一个销售宣传(如果是Scala)。