我有以下内容:
def myFunc(str: String): Something => {
str match {
case "a" | "a1" | "abc" | "qwe" | "23rs" => Something
case _ => None
}
}
字符串列表可能很长,我想将其提取到函数中。自从做
以来,我真的不知道要搜索什么def isSomething(str: String): Boolean => {
List("a","a1","abc","qwe","23rs").contains(str)
}
但case isSomething => Something
不起作用
答案 0 :(得分:1)
您的str
是一个字符串,因此不匹配布尔类型的isSomething
。您的示例代码的另一个问题是None
属于Option类型,因此让匹配大小写返回相同类型会更有意义。以下是使用guard
contains
条件的一种方法:
val list = List("a", "a1", "abc", "qwe", "23rs")
val s = "abc"
s match {
case s if list contains s => Some(s)
case _ => None
}
// res1: Option[String] = Some(abc)
答案 1 :(得分:1)
其他大多数答案似乎都包括修复选项的使用,或者远离模式匹配(简单使用警卫并不是模式匹配,IMO)
我想你可能会问起提取器。如果是这样,这可能更接近你想要的东西:
case class Something(str: String)
// define an extractor to match our list of Strings
object MatchList {
def unapply(str: String) = {
str match {
case "a" | "a1" | "abc" | "qwe" | "23rs" => Some(str)
case _ => None
}
}
}
def myFunc(str: String): Option[Something] = {
// use our new extractor (and fix up the use of Option while we're at it)
str match {
case MatchList(str) => Some(Something(str))
case _ => None
}
}
// Couple of test cases...
myFunc("a") // Some(Something(a))
myFunc("b") // None
答案 2 :(得分:0)
首先,在定义函数时使用了错误的=>
运算符。
scala> def isSomething(str: String): Boolean = {
| List("a","a1","abc","qwe","23rs").contains(str)
| }
isSomething: (str: String)Boolean
scala> def myFunc(str: String): String = {
|
| str match {
| case str if(isSomething(str)) => "Something"
| case _ => "None"
| }
| }
myFunc: (str: String)String
scala> myFunc("a")
res9: String = Something
我不知道是什么东西所以我把它当作一个字符串。您可以根据您的使用情况对其进行修改。 希望它有所帮助。
答案 3 :(得分:0)
您可以执行以下操作
val list = List("a", "a1", "abc", "qwe", "23rs")
def myFunc(str: String): Option[String] = {
list.contains(str) match {
case true => ??? //calling something function should return Some
case false => None
}
}
Option[String]
可以根据您的返回类型进行更改,但None
表示真实案例应返回Option
类型。因此,String
可以更改为您想要的数据类型