2017-07-04 36 views
1


我是scala的新手,并且正在使用Maps。我做了一个Map,但我不确定如何检查返回类型并使用它。
我有以下代码给出以下编译错误“花样的预计类型不兼容:TestClass.type所需选项[识别TestClass]
如何匹配scala的值地图

object MapOptionUsage extends App { 
val map : Map[Int, TestClass] = Map[Int, TestClass]() 
var i = 0 
for(i <- 0 to 5){ 
    map.put(i, createObj(i)) 
} 
var a = map.get(5) 

a match { 
    case TestClass => {//dosomething 
    } 
    case None => {//dosomething 
    } 
    } 
    def createObj(i: Int): TestClass = { 
    return new TestClass(i) 
    } 
} 
case class TestClass(val id: Int) 

回答

2

get()回报Option[],并且TestClass需要一个构造函数的参数,所以你要匹配这两个东西。

case Some(TestClass(x)) => {//dosomething 

BTW,良好的Scala代码不使用varreturn

+0

它工作。但还有一个问题。我如何在变量Some(TestClass(x))中获取它,以便我可以使用该内部大小写块? – Sandeep

+0

'一些(TestClass(x))'将匹配一个'Option [TestClass]','x'是一个包含'id'值的变量。 'case Some(x)'将匹配任何'Option []','x'是保存'TestClass'的变量(在这种情况下)。 'case x'将匹配任何值,'x'是包含该值的可变值。 – jwvh

1

有几个问题。

  1. ,你的地图是不可变的,你不能把东西放在不可变的地图里面。 val map : mutable.Map[Int, TestClass] = mutable.Map[Int, TestClass]()

  2. case Some(x)=> {//dosomething由于返回是一个选项,您需要一个类型来匹配。

  3. def createObj(i: Int): TestClass = {需要在您的对象上定义,而不是在您的匹配语句中。

编辑:为了解决评论。

case Some(x)=> {//dosomething 
    System.out.println(x.id) 
} 

将匹配并创建一个新值,其中x等于Some的内容,即包含在地图中的TestClass。

+0

对不起,我错过了导入,但我使用了一个可变映射,并且createObj没有在匹配中定义。 – Sandeep

+0

2.仍然有效。 1和3在你的问题中是错误的。 一些(x)将匹配其中x是您的TestClass一些(TestClass(x))将x与int匹配。 –

+0

不要导入mutable.map,它会混淆读取你的代码的scala读者。 –