我对初始化
感到困惑var in = None: Option[FileInputStream]
然而,我所知道的是
var varName : type = _ // default value initialization
var varName : type = someValue // other than default intitalization
但是什么是
var in = None: Option[FileInputStream]
请帮忙 感谢
答案 0 :(得分:4)
这称为类型ascription ,结果表达式称为typed expression。它确定了表达式的类型:
try
表示“将expr: Type
视为expr
”。
例如:
Type
显然,表达式需要符合归于它的类型。
最广泛使用的类型归属示例可能是1
// Int
1: Float
// Float
伪类型,它将_*
解包为一系列参数:
Seq
在您的特定情况下,我发现将类型归因于表达式只是为了让类型推断器推断出正确的类型是有问题的,当您可以声明正确的类型开始时:
def sumNums(nums: Int*) = nums.sum
sumNums()
//=> 0
sumNums(1)
//=> 1
sumNums(1, 2)
//=> 3
sumNums(Seq(1, 2))
// error: type mismatch;
// found : Seq[Int]
// required: Int
// sumNums(Seq(1, 2))
// ^
sumNums(Seq(1, 2): _*)
//=> 3
关于你的意见:
然而,我所知道的是var in: Option[FileInputStream] = None
您也可以省略类型:
var varName : type = _ // default value initialization
var varName : type = someValue // other than default intitalization
在这种情况下,类型是从表达式var varName = someValue
推断出来的。
someValue
显然,这不起作用:从表达式推断出类型,但是从类型推断出表达式的值。因此,这是不允许的。
您的示例使用具有推断类型的表单:
var varName = _
因此,var in = someExpression
的类型是从in
的类型推断出来的。
现在,如果我们说
someExpression
然后推断var in = None
的类型为in
,即None.type
对象的单例类型。但这没有意义:当我们给它一个单例类型,即只有一个实例的类型时,为什么我们会有一个None
,即一个我们可以改变的变量。因此,我们可以根据需要重新分配var
,但我们只能为其分配相同的内容。那是不合逻辑的。 (从技术上讲,我们也可以为其分配in
。)
事实上,我们希望能够为其分配一些东西,但也知道我们是否为它分配了一些东西。这就是我们在这种情况下使用null
并使用Option
初始化它的原因。因此,请将None
重新解释为None
,以便Scala推断出正确的类型:
Option
答案 1 :(得分:2)
// [name] = [value] : [type]
var in = None : Option[FileInputStream]
// can equivalently be written as:
var in: Option[FileInputStream] = None
这会创建一个Option[FileInputStream]
类型的变量,其初始值为None
。
要详细了解Scala的Option
类型,请参阅http://www.scala-lang.org/api/current/#scala.Option