我写了下面的逻辑函数,但是我确信可以把它写得更短一些。如果你不熟悉MQTT通配符,you can read up on them here.self
是我们“订阅”的主题,包含零个或多个通配符。incoming
是我们接收到内容的主题,必须完全匹配self
主题,或者符合通配符规则。
我对这个函数的所有测试都成功了,但我就是不喜欢这个Scala函数的冗长和“不灵活”。
def filterTopic(incoming: String, self: String): Boolean = {
if (incoming == self || self == "#") {
true
} else if (self.startsWith("#") || (self.contains("#") && !self.endsWith("#")) || self.endsWith("+")) {
false
} else {
var valid = true
val selfSplit = self.split('/')
var j = 0
for (i <- selfSplit.indices) {
if (selfSplit(i) != "+" && selfSplit(i) != "#" && selfSplit(i) != incoming.split('/')(i)) {
valid = false
}
j += 1
}
if (j < selfSplit.length && selfSplit(j) == "#") {
j += 1
}
j == selfSplit.length && valid
}
}
1条答案
按热度按时间jtw3ybtb1#
这里有一个尝试,假设'+'可以在末尾,主题结构良好