("id"->"1", "name"->"andre")
のようなMap[String,String]
をケースクラスUser(id:String,name:String)
に変換する方法の例を見てきましたが、メソッドmapToUser
を呼び出す - 例えば:暗黙のメソッドを使用して[[String、String]をケースクラスUser(id、name)にキャストする
val r = User.mapToUser(u.get)
println("information for " + r.name + " with id " + r.id)
case class User(id: String, name: String)
object User {
implicit def userToMap(user: User): Map[String, String] = {
Map("id" -> user.id, "name" -> user.name)
}
implicit def mapToUser(m: Map[String, String]) : User = {
User(m.get("id").get, m.get("name").get)
}
def unapply(arg: Map[String,String]): User = User(arg.get("id").get, arg.get("name").get)
}
ScalaはMap[String,String]
にUser
の最初の暗黙的な変換を使用する方法についても理解することは、私はuserToMap
を呼び出す必要はありませんしているが、それは、変換をやって失敗している理由を理解していませんたとえば var r = u.get.asInstanceOf[User]
のようになります。それは、ユーザーに値をキャストすることはできませんと言う - 私はまた.to[User]
を試してみましたが、それは
Error:(73, 24) User takes no type parameters, expected: one val r = u.get.to[User]
全コードの言葉:
import scredis._
import scala.concurrent.Future
import scala.util.{Failure, Success}
case class User(id: String, name: String)
object User {
implicit def userToMap(user: User): Map[String, String] = {
Map("id" -> user.id, "name" -> user.name)
}
implicit def mapToUser(m: Map[String, String]) : User = {
User(m.get("id").get, m.get("name").get)
}
def unapply(arg: Map[String,String]): User = User(arg.get("id").get, arg.get("name").get)
}
object RedisClient {
val redis = new Redis(host="192.168.122.2", passwordOpt = Some("privatemachine"))
import redis.dispatcher
def save(key:String, x : User) : Unit = {
x.foreach {
f => redis.hSet(key, f._1, f._2).onComplete{
case Success(content) => None
case Failure(e) => e.printStackTrace()
}
}
}
def get(key:String) : Future[Option[Map[String,String]]] = {
val result = redis.hGetAll(key)
result.onComplete {
case Success(content) => {
println(" --> " + content)
}
case Failure(e) => e.printStackTrace()
}
result
}
}
object Run extends App {
val redis = new Redis(host="192.168.122.2", passwordOpt = Some("privatemachine"))
import redis.dispatcher
redis.hSet("my-hash", "maker", "BMW")
redis.hGetAll("my-hash") onComplete {
case Success(content) => {
println(content)
}
case Failure(e) => e.printStackTrace()
}
val u1 = User("1", "andre")
RedisClient.save("user_1", u1)
val userResult = RedisClient.get("user_1")
userResult.map {
u =>
//val r = User.mapToUser(u.get)
val r = u.get.to[User]
println("information for " + r.name + " with id " + r.id)
}.onFailure{ case x => println("Look here : " + x)}
}
あなたは( '.TO [ユーザー]を')キャスト使用するべきではありません - ちょうどに明示的に 'r'のタイプを定義します'User'となり、暗黙の変換は' u.get'( 'Map [String、String]')を 'User'に変換することができます:' val r:User = u.get' –
それは答えとしてこれをコミットする気になりますか? –