Scala 不允许我添加整数
Scala not letting me add integers
下面是一些我觉得很合理的代码:
val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> x + 1, 2 -> x + 2))(4)
当我尝试编译它时,出现了两个这样的错误:
Error:(20, 68) type mismatch;
found : Int(1)
required: String
val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> x + 1, 2 -> x + 2))(4)
^
我知道我的编译器正在尝试使用 +
的字符串添加实现。但它为什么要这样做呢?我如何要求编译器在这里使用整数加法?
(将 Int
更改为 Integer
没有帮助。)
这是一个重现错误的简单示例:
scala> def fail(x: Int) = 1 -> x + 1
<console>:10: error: type mismatch;
found : Int(1)
required: String
def fail(x: Int) = 1 -> x + 1
^
游戏中的所有运算符都是左结合的,因此所有内容都是从左到右读取的。也就是说,调用链如下所示:
1.->(x).+(1)
或使用中缀表示法:
(1 -> x) + 1
1 -> x
returns 一个元组 (1, x)
和一个元组没有 +
方法,因此编译器试图将其隐式转换为 String
通过 toString
,因为 String
确实有一个 +
方法,该方法最终失败,因为需要 Int
。
只需使用括号将事物适当分组即可:
scala> def foo(x: Int) = 1 -> (x + 1)
foo: (x: Int)(Int, Int)
问题是,根据 Scala's precedence rules,->
与 +
绑定一样紧密,因为它以 -
开头。
通过添加括号修复:
val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> (x + 1), 2 -> (x + 2)))(4)
'->' has the same precedence as '+',所以 1 -> x + 1
解析为 (1 -> x) + 1
。将括号添加为 1 -> (x + 1)
可修复此错误。
下面是一些我觉得很合理的代码:
val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> x + 1, 2 -> x + 2))(4)
当我尝试编译它时,出现了两个这样的错误:
Error:(20, 68) type mismatch;
found : Int(1)
required: String
val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> x + 1, 2 -> x + 2))(4)
^
我知道我的编译器正在尝试使用 +
的字符串添加实现。但它为什么要这样做呢?我如何要求编译器在这里使用整数加法?
(将 Int
更改为 Integer
没有帮助。)
这是一个重现错误的简单示例:
scala> def fail(x: Int) = 1 -> x + 1
<console>:10: error: type mismatch;
found : Int(1)
required: String
def fail(x: Int) = 1 -> x + 1
^
游戏中的所有运算符都是左结合的,因此所有内容都是从左到右读取的。也就是说,调用链如下所示:
1.->(x).+(1)
或使用中缀表示法:
(1 -> x) + 1
1 -> x
returns 一个元组 (1, x)
和一个元组没有 +
方法,因此编译器试图将其隐式转换为 String
通过 toString
,因为 String
确实有一个 +
方法,该方法最终失败,因为需要 Int
。
只需使用括号将事物适当分组即可:
scala> def foo(x: Int) = 1 -> (x + 1)
foo: (x: Int)(Int, Int)
问题是,根据 Scala's precedence rules,->
与 +
绑定一样紧密,因为它以 -
开头。
通过添加括号修复:
val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> (x + 1), 2 -> (x + 2)))(4)
'->' has the same precedence as '+',所以 1 -> x + 1
解析为 (1 -> x) + 1
。将括号添加为 1 -> (x + 1)
可修复此错误。