【发布时间】:2012-04-05 23:51:01
【问题描述】:
我很困惑。
我认为一切都是表达式,因为语句返回一个值。但我也听说在scala中一切都是对象。
现实中是什么?为什么 scala 选择以一种方式或另一种方式来做呢?这对 Scala 开发人员意味着什么?
【问题讨论】:
标签: scala
我很困惑。
我认为一切都是表达式,因为语句返回一个值。但我也听说在scala中一切都是对象。
现实中是什么?为什么 scala 选择以一种方式或另一种方式来做呢?这对 Scala 开发人员意味着什么?
【问题讨论】:
标签: scala
我认为一切都是表达式,因为语句返回一个值。
有些东西没有价值,但在大多数情况下,这是正确的。这意味着我们基本上可以放弃Scala中“语句”和“表达式”之间的区别。
然而,术语“返回值”不太合适。我们说一切都“评估”为一个值。
但我也听说在 scala 中一切都是对象。
这与前面的陈述完全不矛盾:) 它只是意味着每个可能的 value 都是一个对象(因此每个表达式都计算为一个对象)。顺便说一句,函数作为 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!"
}
【讨论】:
mymethod 甚至不需要大括号,它可以是没有大括号的单线。 def mymethod(x: Int) = if (x > 2) "yay!" else "too low!"
这里的区别在于断言“一切都是表达式”是针对代码块做出的,而“一切都是对象”是关于代码块的。程序中的值。
在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 不是一个对象——它是一个原语。此外,我可以访问TimeUnit 的字段SECONDS,但TimeUnit 也不是对象;它是一个 static (因为需要更好的短语)。在斯卡拉:
val j = 4
Map.empty
就语言而言,j 是一个对象(我可能会向它分派方法),Map 也是一个对象——该类型的模块(或伴生对象) scala.collection.immutable.Map.
【讨论】:
scala 中的一切都是函数、表达式还是对象?
没有。
有些东西不是对象。例如类,方法。
有些东西不是表达式。例如class Foo { } 是一个语句,不计算任何值。 (这点和上面基本一样。)
有些东西不是函数。我不需要提及任何示例,因为在任何 Scala 代码中都会看到很多。
换句话说,“一切都是 X”只不过是一种推销(在 Scala 的情况下)。
【讨论】: