-6ren">
gpt4 book ai didi

scala - 对映射应用隐式转换

转载 作者:行者123 更新时间:2023-12-04 23:16:25 26 4
gpt4 key购买 nike

我在以下示例中尝试了隐式转换:

val m: Map[Int, Int] = Map(10 -> "asd")  //fine
val mm: Map[Int, Int] = Map("asd" -> 20) //type mismatch; found: (String, Int)
//required: (Int, Int)

implicit def stringToInt(str: String): Int = 10

为什么我们不能对映射键应用隐式转换?有没有办法解决这个问题?

最佳答案

它不起作用,因为您使用的是 ->这是一个(内联)运算符:

implicit final class ArrowAssoc[A](self : A) extends scala.AnyVal {
@scala.inline
def ->[B](y : B) : scala.Tuple2[A, B] = { /* compiled code */ }
def →[B](y : B) : scala.Tuple2[A, B] = { /* compiled code */ }
}

您可以看到,在评估 B 时,A 已经“固定”了。假设您只能(隐式)在使用 -> 时转换元组的右侧。运算符(operator):
implicit def stringToInt(str: String): Int = 10  
implicit def intToStr(str: Int): String = "a"

val a: Map[Int, Int] = Map(10 -> "asd") //fine
val b: Map[Int, Int] = Map("asd" -> 20) // error! cant change left side

val c: Map[String, String] = Map("asd" -> 20) // fine
val d: Map[String, String] = Map(10 -> "asd") // error! cant change left side

由于与使用运算符 -> 相关的类似编译器怪癖,@Jorg 的解决方案在一个方向上起作用,但在另一个方向上不起作用:
implicit def tupleIntifier(t: (String, Int)) = (10, 10)
implicit def tupleIntifier2(t: (Int, String)) = (10, 10)

val a: Map[Int, Int] = Map("asd" -> 20) // uses tupleIntifier
val b: Map[Int, Int] = Map(10 -> "asd") // fails!!

但是,如果您避免使用 ->完全使用运算符,只需使用 (key, value)语法,它将起作用:
val a: Map[Int, Int] = Map((10, "asd"))
val b: Map[Int, Int] = Map(("asd", 20))

implicit def stringToInt(str: String): Int = 15

println(a) // prints Map(10 -> 15)
println(b) // prints Map(15 -> 20)

关于scala - 对映射应用隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40549954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com