2016-09-19 13 views
1

Scalaの基本的な概念を理解しようとしています。なぜこのコードはコンパイルされないのですか?オブジェクトを含むマップが期待通りに機能しない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) 
} 

エラー:( - UserRepository.getUsers()(K、V)<){

(25、42)値フィルタのオブジェクトcala.collection.immutable.Map のメンバーではありません私はvalユーザーがMapを持っていると思った?

シンプルなマップが正常に動作している:

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

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

を行います私が完全に理解していないエラーメッセージには、 'val'、' def'などの戻り値の型を明示的に書き留めるのが役に立ちます。あなたの場合、明示的に注記することができます: 'def getUsers():Map [Int、User ] = ... '。 –

+0

Aはそれを試して、それは動作していませんでした - Javaの世界から来て期待していなかった、その新しいラインの雲はそんなに意味する。第二の表現の意味は何ですか? – Levijatanu

+0

'2番目の表現の意味はなんですか?多分アレクセイはあなたの質問に回答したのでしょうか? –

答えて

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

これは、2つの別々の表現である:最初に、あなたは何(Scalaで有効であり、かつusersにタイプMapコンパニオンオブジェクトを割り当て)val users = Map 、次に評価する

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

結果を破棄します。あなたは定義が上の行に(を移動することによって、まだ終わっていないコンパイラに指示した場合、それは動作します:地図カッコ地図に属しScalaのコンパイラに伝えるために

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

私は恋しいです。 soooo多く:)! Tnx – Levijatanu

+0

この2回目の評価の意味は? – Levijatanu

+1

元の例の2番目の式を意味しますか(つまり '(1 - > ...)')?それは2つのタプルのタプルを返し、結果に何も割り当てられていないので結果を投げ捨てます。 (スカラはこのように '1 + 1'の結果を破棄すれば警告を出しますが、残念なことにこのケースではタプルの生成は実際にはコンストラクタ呼び出しであり、副作用を伴う可能性があります)。 –

2

スタート括弧の直後

で実行している場合、代わりにこの

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