我很迷惑.
我认为一切都是表达式,因为语句返回一个值.但我也听说scala中的所有东西都是一个对象.
实际上是什么?为什么scala选择以某种方式做到这一点?这对scala开发人员意味着什么?
Nik*_* B. 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!"
Run Code Online (Sandbox Code Playgroud)
我们还可以将这样的复合表达式的值赋给变量:
val str = value match {
case Some(x) => "Result: " + x
case None => "Error!"
}
Run Code Online (Sandbox Code Playgroud)
这里的区别在于断言"一切都是表达式"是关于代码块的,而"一切都是对象"是关于程序中的值.
在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上面不是一个对象 - 它是一个原始的.此外,我可以访问字段SECONDS的TimeUnit,但TimeUnit不是一个对象要么; 这是一个静态的(想要一个更好的短语).在scala中:
val j = 4
Map.empty
Run Code Online (Sandbox Code Playgroud)
就语言而言,j是一个对象(我可以向它发送方法),就像Map这个类型的模块(或伴随对象)一样scala.collection.immutable.Map.
scala中的所有东西都是函数或表达式或对象吗?
没有.
有些东西不是对象.例如,课程,方法.
有些东西不是表达式.例如class Foo { }是一个陈述,并不评估任何价值.(这与上面基本相同.)
有些东西不是功能.我不需要提及任何示例,因为任何Scala代码都会有很多内容.
换句话说,"一切都是X"只不过是一个销售推销(如果是Scala).
| 归档时间: |
|
| 查看次数: |
2473 次 |
| 最近记录: |