为字符串列表重构scala匹配大小写

时间:2018-05-06 06:15:07

标签: scala pattern-matching match

我有以下内容:

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不起作用

4 个答案:

答案 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可以更改为您想要的数据类型