我正在编写一个函数,该函数通过StringReader
获取多行字符串,并将每行返回为seq
let symbolSeq = seq {
let mutable line = reader.ReadLine()
while !line <> null do
yield line
line <- reader.ReadLine()
}
我正在
此表达式应该具有类型&#39; ref,但这里有类型字符串
on while!---&gt; line&lt; ---&lt;&gt; null do
当我摆脱!
前面的line
时,我得到了一个
可变变量&#39; line&#39;以无效的方式使用。闭包不能捕获可变变量。考虑通过&#39; ref&#39;来消除这种突变的使用或使用堆分配的可变参考单元。和&#39;!&#39;。
为什么?
答案 0 :(得分:3)
因为seq-expression隐式创建闭包,并且你不能在F#中关闭可变变量。
答案 1 :(得分:2)
您需要将行值放在ref单元格中,因为无法关闭可变值。
let symbolSeq = seq {
let line = ref (reader.ReadLine())
while !line <> null do
yield !line
line := reader.ReadLine()
}
答案 2 :(得分:1)
使用ref cell的另一种方法是使用递归和yield!:
let symbolSeq =
let rec iterate (reader : System.IO.StringReader) =
seq
{
match reader.ReadLine() with
| null -> ()
| x ->
yield x
yield! iterate reader
}
iterate reader