【问题标题】:How to use pattern matching in this if/else?如何在这个 if/else 中使用模式匹配?
【发布时间】:2016-05-07 03:51:28
【问题描述】:

我编写了一个带有 if/else 子句的函数,但考虑了使用模式匹配的可能性。我失败了,但很高兴看到它可以如何完成它的学习成果。

def sha1():String = {
    if (System.getProperty("os.name").contains("OS X")){
       ("x.tif" !!).toString
    }
    else{
      "failed"
    }
}

我用我希望字符串参与测试的逻辑尝试了这个(“test”包含(“0S X”)是合法的)。这会导致错误。

 def sha2(command:String):String = System.getProperty("os.name") match {
    case contains("OS X")=> ("x.tif" !!).toString

} 

第二次尝试是写一些类似的东西,我将输入匹配到一个函数调用:

def sha3():String = System.getProperty("os.name").contains(x) match {
    case x=="OS X" => "hello"
}

【问题讨论】:

    标签: scala pattern-matching


    【解决方案1】:

    这将是一个使用模式匹配来表达的选项

    def sha1():String = System.getProperty("os.name") match {
      case s if s.contains("OS X") => ("x.tif" !!).toString
      case _ => "failed"
    }
    

    如果你的代码真的只有一个case,那么使用ifelse可能会更好

    def sha1(): String = 
      if ( System.getProperty("os.name").contains("OS X") )
        ("x.tif" !!).toString
      else
        "failed"
    

    【讨论】:

    • 谢谢,我认为这很简单。我想我会用更多的测试来扩展它,然后我认为模式匹配在语法上会变得更好。你为什么转发我的 if/else 函数?
    • 我重新发布了一个语法改变的版本,去掉了多余的括号。有时这读起来更好。如果您可以将 if 检查移至一个简短的功能,那么您最终会得到一个不错的单行。 if ( isOSX ) ("x.tif" !!).toString else "failed"
    • 好的。如果 Scala 以与 C 相同的方式处理括号,我不喜欢删除括号(一行连接到 if,添加另一行并且未连接到 if,因此独立于 if 测试结果执行) .
    【解决方案2】:

    您不需要为此进行模式匹配。做吧:

    "OS X".r
      .findFirstIn(System.getProperty("os.name"))
      .map { _ => ("x.tif" !!).toString }
      .getOrElse("failed")
    

    【讨论】:

    • 我想添加其他案例(linux 和 windows),我认为您的方法在这方面不能很好地扩展。
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2016-09-08
    • 2021-06-15
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多