【问题标题】:Pattern match for Integer range整数范围的模式匹配
【发布时间】:2012-12-27 18:52:31
【问题描述】:

我的函数的目的是对一个整数加5,只要该整数大于0且小于或等于7。我尝试:

val add5Partial : PartialFunction[Int, Int] = {
  case d if (0 < d <= 7) => d + 5;
} 

我明白了:

<console>:8: error: type mismatch;
 found   : Int(7)
 required: Boolean
         case d if (0 < d <= 7) => d + 5;

有什么建议吗?

【问题讨论】:

  • om-nom-nom 有答案。据我所知,no 常见的现代编程语言允许使用您使用的那种速记符号。还要注意,您不需要围绕守卫表达式的最外层括号,Scala 中的分号是非常糟糕的风格!此外,仅在使用上下文绑定语法时在冒号左侧放置一个空格。
  • @RandallSchulz python 可以做到这一点。实际上,我已经看到 scala 邮件列表中的某个人也使用 scala 完成了此操作,但还有一些额外的技巧。现在找不到了。

标签: scala pattern-matching


【解决方案1】:

您无法在一次比较中做到这一点。你需要使用:

(d > 0) && (d <= 7)

正如您所做的那样,它会将一个比较与布尔值进行比较,然后在第二个比较中无法将其用作 int。

【讨论】:

    【解决方案2】:

    Scala 不支持这种开箱即用的语法,所以你必须写:

    val partial : Int => Int = {
      case d if (d > 0) && (d <= 7) => d + 5;
    } 
    

    或者你可以这样做:

    val partial : Int => Int = {
      case d if 1 to 7 contains d => d + 5;
    } 
    

    【讨论】:

      【解决方案3】:

      您可以执行以下任何操作:

      val f = (n: Int) ⇒ if (n &gt; 0 &amp;&amp; n &lt;= 7) n + 5 else n

      // 或 ...

      def f(n: Int) = if (n &gt; 0 &amp;&amp; n &lt;= 7) n + 5 else n

      // 或 ...

      def f(n: Int): Int = n match {
          case n if n > 0 && n <= 7 ⇒ n + 5
          case _ ⇒ n
      }

      // 或者(说起来……@om-nom-nom 的评论)

      def f(n: Int) = n match {
          case n if 0 to 7 contains n ⇒ n + 5
          case _ ⇒ n
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多