在scala中声明时的var initalization

时间:2016-09-07 12:05:47

标签: scala

我对初始化

感到困惑
var in = None: Option[FileInputStream]
然而,我所知道的是

var varName : type = _ // default value initialization
var varName : type = someValue // other than default intitalization

但是什么是

 var in = None: Option[FileInputStream] 

请帮忙 感谢

2 个答案:

答案 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