预期诠释,得到IntProgression代替

我正在努力克服Kotlin,所以我正在学习他们自己的教程 。

所以他们试图创建一个给定一个字符串的序列,例如:

"a vect" -> [ a vect : a vec : t a ve : ct ... ] 

根据视频,做到这一点的方法如下:

 val seq = sequenceOf(canonicalisedInput.lastIndex + 1 downTo 0).map { canonicalisedInput.substring(0, it) to canonicalisedInput.substring(it) } 

我得到了我所做的(好吧,这个想法)。 问题是substring需要两个Int ,而it (我认为是来自downTo进程的某种隐式迭代器)是IntProgression 。 第二substring调用相同。

我错过了什么?

你发布的代码中包含一个错误: sequenceOf(...)传递了单个参数,返回一个包含该项的序列,即Sequence<IntProgression> 。 要获得一系列索引( Sequence<Int> ),请使用asSequence()函数:

  (canonicalisedInput.lastIndex + 1 downTo 0).asSequence().map { ... } 

被称为second的substring(...)函数是重载,它返回从作为参数传递的索引开始的子串 。

it是最内层lambda单参数的隐式名称 ,在这种情况下,它是map的参数,即由lambda映射的序列项。

所以,lambda表达式里面的表达式是一对(由infix函数创建的)两个子字符串,一个从原始字符串开始到序列中的索引,另一个 – 从该索引到字符串结尾。

所以这个代码应该可以和索引序列一起工作,这就是为什么这个错误很明显。

sequenceOf(canonicalisedInput.lastIndex + 1 downTo 0) – 此表达式创建一个由单个IntProgression项组成的序列。

如果要将IntProgression转换为Sequence<Int> ,请使用asSequence扩展函数:

 (canonicalisedInput.length downTo 0).asSequence()