【问题标题】:scala error illegal variable in pattern alternative on pattern matching case模式匹配案例中模式替代中的scala错误非法变量
【发布时间】:2016-08-13 11:53:29
【问题描述】:

我是 scala 的新手。我正在编写如下模式匹配:

  val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
  show(capitals.get("test"))
  def show(x: Option[String]) = x match {
    case Some(s) | None  => s
  }

我收到错误:

Error: illegal variable in pattern alternative
    case Some(s) | None  => s
              ^

我正在尝试查看如何实现或达到我在 java 中的 if 语句中的条件

if (str == null || str.isEmpty())

你能帮忙重写代码或指出错误吗?

问题:如何在案例模式匹配中提及或条件?

【问题讨论】:

    标签: scala pattern-matching


    【解决方案1】:

    最直接的解决方案是使用the method defined for maps,它将默认值作为第二个参数:

    capitals.getOrElse("test","N/A")
    

    【讨论】:

      【解决方案2】:

      我认为这就是您想要实现的目标。如果s 在映射返回中具有值,则s。如果 s 在映射中没有值,则返回一条消息指示。

      val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
      
      def show(x: Option[String]) = x match {
        case Some(s)  => s
        case None     => "x has no value"
      } 
      
      show(capitals.get("mani"))
      

      show 的类似且更简洁的版本是 capitals.get("mani").getOrElse("No value found"),它返回 No value found.

      此外,您可以使用警卫检查s 上的各种条件,例如第一个字符是否为大写。仅当s 以大写字符开头时,第一种情况才会匹配。

       def show(x: Option[String]) = x match {
           case Some(s) if(s.head.isUpper) => s
           case None     => "No value"
       } 
      

      【讨论】:

        【解决方案3】:

        这是您在选项上进行模式匹配的方式:

        def show(x: Option[String]) = x match {
          case Some(s) => s
          case None => "N/A"
        }
        

        (顺便说一句,你也可以这样做):

        capitals.get("test").getOrElse("N/A")
        

        现在,要向模式匹配案例添加 OR 条件,您不能使用绑定变量。但是,这将起作用:

        def show(x: Option[String]) = x match {
          case Some(_) | None => "a"
        }
        

        请注意,唯一的区别在于 Some(_) 与您的 Some(s) 不同。使用Some(s) 没有多大意义,因为无论如何你都不能重用那个s(如果None 来了,那s 会是什么情况?)

        【讨论】:

        • 这是信息。我想实现的是什么?忽略这种情况..是或声明是可能的?我有三个案例说 case Some[], case None, case _ 。而不是写三个案例,我想看看我是否可以给它作为或。就像我想对 or 条件进行操作。我如何实现它而不是编写两个案例?
        • 感谢您富有洞察力的回答。这正是我正在寻找的。​​span>
        • 是否有可能以某种方式将intOpt match { case Some(i) if (i < 2) => true case None => true case _ => false } 减少为... case None | Some(_) if (_ < 2) => true
        • @ristohietal 我不确定,因为“如果”部分在“无”的情况下没有意义。但我个人也不会喜欢它,即使它是可能的。您的三个不同案例的陈述非常有意义,并且更易于阅读。也许将None case 放在Some(i) if (i < 2) case 之前会更容易阅读和理解。当然,这都是非常主观的。
        【解决方案4】:

        匹配Some(s) | None 没有意义,就像if (true || false) 一样(只是无操作,因为它不分派案例)。

        x match {
          case Some(s) => println(s"Some($s)")
          case _ => println("_None")
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-27
          • 1970-01-01
          • 2013-09-13
          • 2017-02-25
          • 1970-01-01
          • 2017-05-19
          • 1970-01-01
          相关资源
          最近更新 更多