【问题标题】:Map containing Objects not working as expected Scala包含未按预期工作的对象的地图 Scala
【发布时间】:2016-09-19 12:31:28
【问题描述】:

尝试理解基本的 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 的成员 for ((k,v)

我预计 val users 持有 Map ?

简单的地图工作正常:

val simpleMap = Map (1 -> "First", 2 -> "Second")

for ((k,v) <- simpleMap ){
 println(v)
}

【问题讨论】:

  • 当遇到我不完全理解的错误消息时,明确注意 valdef 等的返回类型会有所帮助。在您的情况下,您可以明确注意:@ 987654325@.
  • 试过了,但没有成功——来自 Java 世界没想到,新的行云意味着这么多。第二个表达是什么意思?
  • What is the meaning of second expression ? 你能说更多吗?也许 Alexey 已经用他发布的答案回答了你的问题?

标签: scala object dictionary


【解决方案1】:
val users = Map
( 1 ->  User(1, "John", "Doe", 32, Some("male")),
  2 -> User(2, "Johanna", "Doe", 30, None)
)

这是两个单独的表达式:首先执行val users = Map(在Scala 中有效,并将Map 类型的伴生对象 分配给users),然后求值

( 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)
)

【讨论】:

  • 我想念;太棒了:)! Tnx
  • 第二次评价是什么意思?
  • 您是指原始示例中的第二个表达式(即(1 -&gt; ...))吗?它将返回一个由两个元组组成的元组,然后将结果丢弃,因为它没有分配给任何东西。 (如果你像这样丢弃1 + 1 的结果,Scala 会给你一个警告,但不幸的是在这种情况下不会,因为创建元组实际上是一个构造函数调用,它可能会产生副作用。)
【解决方案2】:

在 Map 之后立即开始括号告诉 scala 编译器括号属于 Map

而不是这个

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 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2013-06-04
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多