我有两个继承自泛型类的类。
class Parser<I: CollectionType, T> {
func parse(ts: I) -> [(T, I)] { return [] }
func parse_all(ts: I) -> [(T, I)] {
return parse(ts).filter { isEmpty($0.1) }
}
}
class CharParser<I: CollectionType, T> : Parser<[Character], Character> {
let c: Character
init(c: Character) { self.c = c }
override func parse(ts: [Character]) -> [(Character, [Character])] {
println(ts)
return ts[0] == c ? [(ts[0], Array(ts[1..<ts.count]))] : []
}
}
class AltParser<I: CollectionType, T> : Parser<I, T> {
let p: Parser<I, T>
let q: Parser<I, T>
init(p: Parser<I, T>, q: Parser<I,T>) {
self.p = p
self.q = q
}
override func parse(ts: I) -> [(T, I)] {
println(ts)
return p.parse(ts) + q.parse(ts)
}
}
class SeqParser<I: CollectionType, T, S>: Parser<I, (T, S)> {
let p: Parser<I, T>, q: Parser<I,S>
init(p: Parser<I, T>, q: Parser<I,S>) { self.p = p; self.q = q }
override func parse(ts: I) -> [((T, S), I)] {
var acc = [((T, S), I)]()
for (head1, tail1) in p.parse(ts) {
for (head2, tail2) in q.parse(tail1) {
acc += [((head1, head2), tail2)]
}
}
return acc
}
}
调用
let x = CharParser<[Character], Character>(c: "a")
x.parse(Array("a"))
工作正常,但尝试通过AltParser调用它会导致EXC_BAD_ACCESS
let x2 = CharParser<[Character], Character>(c: "b")
let y = AltParser(p: x, q: x2)
let z = y.parse(Array("a"))
这是编译器错误还是我误解了泛型?
答案 0 :(得分:0)
好吧,由于完全没有证明你无法做到这一点,现在我将试图证明你可以做到这一点。这是我认为有效的代码的大幅简化版本(至少它编译并且不会崩溃):
class Parser<T> {
func parse(ts:[T]) -> [(T, [T])] { println ("super"); return []}
}
class StringParser<T> : Parser<String> {
let c : String
init(c: String) { self.c=c }
override func parse(ts:[String]) -> [(String, [String])] {
println ("sub")
return ts[0] == c ? [(ts[0], Array(ts[1..<ts.count]))] : []
}
}
class AltParser<T> : Parser<T> {
let p : Parser<T>
init(p:Parser<T>) {
self.p = p
}
override func parse(ts:[T]) -> [(T, [T])] {
return p.parse(ts)
}
}
func test() {
let x = StringParser<Character>(c:"a")
x.parse(["a"])
let z = AltParser(p:x)
println(z.parse(["a"]))
}
我删除了一些看似多余的例子。我把角色变成了一个字符串,因为我觉得角色很混乱。我删除了parse_all
和第二个属性q
,因为您没有将它们用于任何事情。最重要的是,我从泛型中删除了整个CollectionType,并用一个显式数组替换它;那是因为CollectionType给我编译带来了麻烦。我很沮丧,特别是当我仍然在泛型中使用CollectionType时,由于无法找到指定它的方法而是T的集合;在我看来,在某种程度上至关重要的是应该明确这一点。这就是为什么我删除它并用一个明确的T数组替换它的一个原因。但也许我偶然发现了一些有用的东西,因为代码似乎现在正在运行。
继续把它分开......!