【问题标题】:Why does Scala query return as unit?为什么 Scala 查询以单位返回?
【发布时间】:2012-04-09 14:08:31
【问题描述】:

对从多个位置提取的某些数据运行 Squeryl 调用,但由于某种原因,它作为一个单元返回。如何让它作为 Iterable 返回?

下面是数据的拉取:

/**
   * gets a stream for a particular user
   */
  def getUserStream(userId:Long) {
    User.teamIds(userId).toList.map( (team) =>
      Stream.findByTeam(team,0,5).map( (stream) => 
        List(stream)
      ).flatten
    ).flatten.sortBy(_.id)
  }

然后输出数据,结果返回为Unit

Stream.getUserStream(userId) match {
      case results => {
        Ok( generate(results.map( (stream) => Map(
                "id" -> stream.id,
                "model" -> stream.model,
                "time" -> stream.time,
                "content" -> stream.content
                ))
            ) ).as("application/json")
      }
      case _ => Ok("")
    }

我最初的猜测是一个函数可以返回一个 None,但它不会只返回一个空列表吗?

【问题讨论】:

标签: scala


【解决方案1】:

您在 def getUserStream(userId:Long) 方法体之前缺少等号。

def func(x: Int) { x + 1 } // This will return Unit
def func(x: Int) = { x + 1 } // This will return a Int

【讨论】:

  • 啊,原来如此!谢谢,仍然在实践中使用 Scala 的一些语法。欢呼
【解决方案2】:

补充一点可能有用的,说def f(x: Int) {}

相当于说def f(x: Int): Unit = {}

如果您不声明返回类型(例如def f(x: Int) = {}),则将从您的方法体中推断出类型。

保证您返回某种类型的技术是显式声明它。当您想要导出具有特定签名的公共接口时,您会执行此操作。这很重要,因为如果您让类型推断器完成所有工作,它可能会暴露出比您想要的更通用的抽象。

def f(x: Int): List[User] = {} // This will not compile.

【讨论】:

  • 显式返回类型还可以让您进行方法级别的转换。 "def makeNodes: scala.xml.NodeSeq = {...}"
猜你喜欢
  • 2021-03-21
  • 2021-01-02
  • 1970-01-01
  • 2021-10-26
  • 2020-03-01
相关资源
最近更新 更多