2012-04-09 214 views
1

對一些從多個位置拉出來的數據運行Squeryl調用,但由於某種原因它會作爲一個單位返回。我如何讓它作爲Iterable返回?爲什麼Scala查詢返回單位?

下面是拉的數據:

/** 
    * 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("") 
    } 

我最初的猜測是一個函數可以返回爲無,但它不會只是返回一個空的列表?

+0

可能重複的[何時使用等號在Scala的方法聲明登錄?](http://stackoverflow.com/questions/944111/when-to-use-the-equals-sign- in-a-scala-method-declaration) – 2012-04-09 04:37:15

回答

5

您錯過了等號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 
+0

就是這樣啊!謝謝,仍然在Scala的一些語法中進行實踐。歡呼聲 – crockpotveggies 2012-04-09 04:20:04

0

要加一點點,可能是有用的,說def f(x: Int) {}

是說def f(x: Int): Unit = {}

如果不聲明返回類型的當量(例如def f(x: Int) = {})的類型將被推斷從你的方法體。

確保您返回某種類型的技巧是明確聲明它。這是你想要導出具有特定簽名的公共接口時要做的事情。這很重要,因爲如果你讓類型推理器完成所有的工作,它可能會暴露一個比你想要的更普遍的抽象。

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

+0

顯式返回類型也讓你做方法級別投射。 「def makesNodes:scala.xml.NodeSeq = {...}」 – virtualeyes 2012-04-09 07:40:33