我的程序中有以下Scala代码:
val parser = new PlainToTokenParser(...)
for {
word: Word <- parser.next()
if word == null
} {
print(word)
}
其中PlainToTokenParser
是另一个库中的java类:
public class PlainToTokenParser implements Parser {
public PlainToTokenParser(Parser p) {
this.parser = p;
}
public Object next() {
// some work here and return an output
}
}
编译我的scala代码时出现以下错误:
... value filter is not a member of Object
[error] for{ word: Word <- parser.next()
[error]
知道我哪里错了吗?
答案 0 :(得分:6)
因为PlainToTokenParser
不是scala迭代器,所以必须创建一个scala迭代器来使用for
循环。
val parser = new PlainToTokenParser(...)
for {
word <- Iterator.continually(parser.next).takeWhile(_ != null) // Assume null is the end
} {
print(word)
}
BTW:你可以遍历java Array / Map,因为scala隐式创建了一个迭代器。
答案 1 :(得分:1)
for
- 循环迭代一个对象。您想迭代Word
返回的parser
。但是你的代码实际上需要第一个Word
并尝试迭代它。 (另一个问题是next
返回Object
,而您的变量属于Word
类型。)
Scala将for
- 循环编译为一系列方法调用。 spec表示它会转换为map
,withFilter
,flatMap
和foreach
。要迭代的对象必须(至少部分)这些方法才能使for
循环起作用。由于某些原因,它实际上试图在filter
返回的Object
上致电parser.next()
。
(见Zeng的解决方案答案。我认为解释也很有用。)