包含未按预期工作的对象的映射Scala

包含未按预期工作的对象的映射Scala,scala,object,dictionary,Scala,Object,Dictionary,试图理解Scala的基本概念。为什么这段代码没有编译 case class User( id: Int, firstName: String, lastName: String, age: Int, gender: Option[String]) object UserRepository { val users = Map ( 1 -&g

试图理解Scala的基本概念。为什么这段代码没有编译

 case class User(
               id: Int,
               firstName: String,
               lastName: String,
               age: Int,
               gender: Option[String])

object UserRepository {
 val users = Map
 ( 1 ->  User(1, "John", "Doe", 32, Some("male")),
   2 -> User(2, "Johanna", "Doe", 30, None)
   )
//def findById(id: Int): Option[User] = users
//def findAll = users.values
def getUsers() = { users }
}

for ((k,v) <- UserRepository.getUsers() ){
 println(v)
}
错误:25,42值筛选器不是对象cala.collection.immutable.Map的成员 对于k,v 这是两个独立的表达式:首先执行在Scala中有效的val users=Map,并将Map类型的伴随对象分配给用户,然后计算

( 1 ->  User(1, "John", "Doe", 32, Some("male")),
  2 -> User(2, "Johanna", "Doe", 30, None)
)
然后扔掉结果。如果移动到上一行,告诉编译器定义尚未结束,它将工作:

val users = Map(
  1 ->  User(1, "John", "Doe", 32, Some("male")),
  2 -> User(2, "Johanna", "Doe", 30, None)
)
这是两个独立的表达式:首先执行在Scala中有效的val users=Map,并将Map类型的伴随对象分配给用户,然后计算

( 1 ->  User(1, "John", "Doe", 32, Some("male")),
  2 -> User(2, "Johanna", "Doe", 30, None)
)
然后扔掉结果。如果移动到上一行,告诉编译器定义尚未结束,它将工作:

val users = Map(
  1 ->  User(1, "John", "Doe", 32, Some("male")),
  2 -> User(2, "Johanna", "Doe", 30, None)
)

在映射之后立即启动括号,告诉scala编译器括号属于映射

而不是这个

object UserRepository {
 val users = Map
 ( 1 ->  User(1, "John", "Doe", 32, Some("male")),
   2 -> User(2, "Johanna", "Doe", 30, None)
   )
//def findById(id: Int): Option[User] = users
//def findAll = users.values
def getUsers() = { users }
}
这样做

object UserRepository {
   val users = Map( 1 ->  User(1, "John", "Doe", 32, Some("male")),
     2 -> User(2, "Johanna", "Doe", 30, None)) //start parenthesis after Map
   //def findById(id: Int): Option[User] = users
   //def findAll = users.values
  def getUsers() = { users }
}

在映射之后立即启动括号,告诉scala编译器括号属于映射

而不是这个

object UserRepository {
 val users = Map
 ( 1 ->  User(1, "John", "Doe", 32, Some("male")),
   2 -> User(2, "Johanna", "Doe", 30, None)
   )
//def findById(id: Int): Option[User] = users
//def findAll = users.values
def getUsers() = { users }
}
这样做

object UserRepository {
   val users = Map( 1 ->  User(1, "John", "Doe", 32, Some("male")),
     2 -> User(2, "Johanna", "Doe", 30, None)) //start parenthesis after Map
   //def findById(id: Int): Option[User] = users
   //def findAll = users.values
  def getUsers() = { users }
}

我想念;太多了:!TNX第二次求值的含义是什么?您是指原始示例中的第二个表达式,即1->。。。?它将返回一个包含两个元组的元组,然后丢弃结果,因为它没有分配给任何对象。如果你像这样扔掉1+1的结果,Scala会给你一个警告,但不幸的是不是在这种情况下,因为元组创建实际上是一个构造函数调用,它可能有副作用;太多了:!TNX第二次求值的含义是什么?您是指原始示例中的第二个表达式,即1->。。。?它将返回一个包含两个元组的元组,然后丢弃结果,因为它没有分配给任何对象。如果您像这样扔掉1+1的结果,Scala会给您一个警告,但不幸的是,在这种情况下不会,因为元组创建实际上是一个构造函数调用,它可能会有副作用。当遇到我不完全理解的错误消息时,显式注意val的返回类型def,在您的例子中,您可以明确地注意到:def getUsers:Map[Int,User]=…A尝试过这个方法,但它不起作用-来自Java世界,这是出乎意料的,新线云意味着这么多。第二个表达是什么意思?第二个表达是什么意思?你能多说几句吗?也许Alexey已经用他发布的答案回答了您的问题?当遇到我不完全理解的错误消息时,显式地记录val、def等的返回类型会有帮助。在您的例子中,您可以显式地记录:def getUsers:Map[Int,User]=…a尝试了这个方法,但它不起作用-来自Java world,这是出乎意料的,新的线云意义重大。第二个表达是什么意思?第二个表达是什么意思?你能多说几句吗?也许Alexey已经用他贴出的答案回答了你的问题?