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

use*_*855 8 scala

我很迷惑.

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

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

Nik*_* B. 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!"
Run Code Online (Sandbox Code Playgroud)

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

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


oxb*_*kes 7

这里的区别在于断言"一切都是表达式"是关于代码块的,而"一切都是对象"是关于程序中的值.


代码块

在Java语言中,有表达式语句.也就是说,任何的代码"块"是任一的表达一个陈述;

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

表达式有一种类型 ; 陈述没有; 语句纯粹因其副作用而被调用.

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

if (x == 4) foo else bar //has the type lub of foo and bar
Run Code Online (Sandbox Code Playgroud)

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

val x = if (x == 4) foo else bar
Run Code Online (Sandbox Code Playgroud)

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

int i = foo(); //i is a reference to a value
java.util.TimeUnit.SECONDS;
Run Code Online (Sandbox Code Playgroud)

在Java中,i上面不是一个对象 - 它是一个原始的.此外,我可以访问字段SECONDSTimeUnit,但TimeUnit不是一个对象要么; 这是一个静态的(想要一个更好的短语).在scala中:

val j = 4
Map.empty
Run Code Online (Sandbox Code Playgroud)

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

  • @pjp"最低上限" - foo和bar类型最接近的公共父类型. (2认同)

mis*_*tor 6

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

没有.

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

有些东西不是表达式.例如class Foo { }是一个陈述,并不评估任何价值.(这与上面基本相同.)

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

换句话说,"一切都是X"只不过是一个销售推销(如果是Scala).