为什么 cons 函数称为显式在 Scala 中的 Int 上有效



您可以使用以下命令在 Scala 中创建新列表:

1 :: 2 :: Nil

据我了解,这可以重写为:

Nil.::(2.::(1))

主要是因为::固定,但如果我写:

Nil :: 1 :: 2

我得到"值::不是Int的成员",这是完全预期的,因为在scaladoc Int中没有::,但是如果我将其转换为,我不明白为什么

1.::(2.::(Nil))

它可以作为输出工作:

List(1.0, 2.0)

看起来 scalac 自动将12转换为与 Int 不同的类型。这是对的吗?如果是,为什么会发生,这种奇怪的类型是什么?

很有趣。

你的表达

1.::(2.::(Nil))

编译器正在解析为

1. :: (2. :: (Nil))

由于::是右结合的,因此与

1. :: 2. :: Nil

由于1.是编写Double的有效方式,因此与

1.0 :: 2.0 :: Nil

这是构造List[Double]的法律表达

List(1.0, 2.0)

你写的表达式

1 :: 2 :: Nil

可以改写为

Nil.::(2.::(1))

这不太正确,因为2.被解析为Double。这可以通过在 2 周围添加括号来解决,但编译器仍然抱怨因为类 Int 不支持方法 ::

给定的表达式可以写为

(Nil.::(2)).::(1)

您拥有的另一个表达式是

1.::(2.::(Nil))

在这里,编译器将1.2.解析为双精度,即它在读取令牌时急切地消耗尽可能多的字符。如果你想避免这种情况,那么你可以在整数两边加上括号,或者在数字和点之间添加一个空格:

1 .::(2 .::(Nil))
(1).::((2).::(Nil))

但是,您也会收到这些表达式的错误,因为::不是类 Int 的成员(也不是存在隐式转换的任何类的成员(。

相关内容

  • 没有找到相关文章

最新更新