2

您可以使用以下方法在 Scala 中创建新列表:

1 :: 2 :: Nil

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

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

主要是因为 :: fixty 但如果我写:

Nil :: 1 :: 2

我得到“值 :: 不是 Int 的成员”这是完全可以预期的,因为在 scaladoc Int 中没有 ::,但如果我将其翻译为:

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

它作为输出工作:

List(1.0, 2.0)

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

4

2 回答 2

6

这很好笑。

你的表情

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

被编译器解析为

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

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

1. :: 2. :: Nil

其中,因为1.是编写 a 的有效方式Double,所以与

1.0 :: 2.0 :: Nil

这是构造List[Double]

List(1.0, 2.0)
于 2012-05-20T03:24:02.003 回答
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(也不是存在隐式转换的任何类的成员)。

于 2012-05-22T20:43:52.097 回答