我很困惑。
我认为一切都是表达式,因为语句返回一个值。但我也听说scala中的所有内容都是一个对象。
现实中是什么?为什么scala选择以某种方式做到这一点?这对scala开发人员意味着什么?
答案 0 :(得分:15)
我认为一切都是表达式,因为语句返回一个值。
有些东西没有价值,但在大多数情况下,这是正确的。这意味着我们基本上可以放弃Scala中“statement”和“expression”之间的区别。
然而,术语“返回值”并不合适。我们说一切都“评估”到一个值。
但我也听说scala中的所有内容都是一个对象。
这与之前的语句完全不矛盾:)它只是意味着每个可能的值都是一个对象(因此每个表达式都会计算一个对象)。顺便说一下,作为Scala中的一等公民的功能也是对象。
为什么scala选择以某种方式做到这一点?
必须注意的是,这实际上是Java方式的一般化,其中语句和表达式是不同的东西,而不是一切都是对象。你可以将每一段Java代码翻译成Scala而不需要很多改编,但不是相反的。因此,这个设计决策使Scala在简洁性和表现力方面实际上更强大。
这对scala开发人员意味着什么?
这意味着,例如:
return
,因为您可以将返回值作为方法中的最后一个表达式if
和case
是表达式来缩短代码的事实一个例子是:
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)。