您可以使用以下命令在 Scala 中创建新列表:
1 :: 2 :: Nil
据我了解,这可以重写为:
Nil.::(2.::(1))
主要是因为::固定,但如果我写:
Nil :: 1 :: 2
我得到"值::不是Int的成员",这是完全预期的,因为在scaladoc Int中没有::,但是如果我将其转换为,我不明白为什么
:1.::(2.::(Nil))
它可以作为输出工作:
List(1.0, 2.0)
看起来 scalac 自动将1
和2
转换为与 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
的成员(也不是存在隐式转换的任何类的成员(。