Scala:for循环中的条件保护
Scala: Conditional guard in for loop
我需要一些关于 Scala for 循环中守卫的启发:我的代码是
for {
enterprise <- itr
preferName <- enterprise \* qpreferedName
variantName <- enterprise \* qvariantName
attrVRes <- enterprise \* qtype \@ attrRes
if (text(preferName).contains(keyword) || text(variantName).contains(keyword))
} {
//loop code
}
现在可以使用文件了。但是我想检查keyword
的值,如果是空字符串,我不会应用这个守卫(if (text(preferName).contains(keyword) || text(variantName).contains(keyword))
),否则应用它。
有人能告诉我一个好的方法吗?
因为 keyword
似乎是在 for comprehension 之外定义的,我会在那里设置一个布尔值,然后将它添加到守卫中。例如:
val keywordInvalid = keyword.isEmpty // Or however you want to define your condition
for {
enterprise <- itr
preferName <- enterprise \* qpreferedName
variantName <- enterprise \* qvariantName
attrVRes <- enterprise \* qtype \@ attrRes
if keywordInvalid || text(preferName).contains(keyword) || text(variantName).contains(keyword)
} {
//loop code
}
或者翻转它(根据@Łukasz 的评论):
val keywordValid = keyword.nonEmpty
...
for {
...
if keywordValid && ((text(preferName).contains(keyword) || text(variantName).contains(keyword))
} {
//loop code
}
您可以定义这样的实用程序
def textContains(str: String): String => Boolean = str match {
case "" => Function.const(true)
case _ => text(_).contains(str)
}
并将其用作
for {
/* ... */
if Seq(preferName,variantName).exists(textContains(keyword))
} yield ???
我需要一些关于 Scala for 循环中守卫的启发:我的代码是
for {
enterprise <- itr
preferName <- enterprise \* qpreferedName
variantName <- enterprise \* qvariantName
attrVRes <- enterprise \* qtype \@ attrRes
if (text(preferName).contains(keyword) || text(variantName).contains(keyword))
} {
//loop code
}
现在可以使用文件了。但是我想检查keyword
的值,如果是空字符串,我不会应用这个守卫(if (text(preferName).contains(keyword) || text(variantName).contains(keyword))
),否则应用它。
有人能告诉我一个好的方法吗?
因为 keyword
似乎是在 for comprehension 之外定义的,我会在那里设置一个布尔值,然后将它添加到守卫中。例如:
val keywordInvalid = keyword.isEmpty // Or however you want to define your condition
for {
enterprise <- itr
preferName <- enterprise \* qpreferedName
variantName <- enterprise \* qvariantName
attrVRes <- enterprise \* qtype \@ attrRes
if keywordInvalid || text(preferName).contains(keyword) || text(variantName).contains(keyword)
} {
//loop code
}
或者翻转它(根据@Łukasz 的评论):
val keywordValid = keyword.nonEmpty
...
for {
...
if keywordValid && ((text(preferName).contains(keyword) || text(variantName).contains(keyword))
} {
//loop code
}
您可以定义这样的实用程序
def textContains(str: String): String => Boolean = str match {
case "" => Function.const(true)
case _ => text(_).contains(str)
}
并将其用作
for {
/* ... */
if Seq(preferName,variantName).exists(textContains(keyword))
} yield ???