预期诠释,得到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()