【问题标题】:Can we use match to check the type of a class我们可以使用 match 来检查一个类的类型吗
【发布时间】:2013-05-25 02:42:42
【问题描述】:

我是 scala 新手,我现在正在学习 match 关键字。

我想知道我们是否可以使用关键字match 来检查类的类型。我的代码是:

object Main {
    def main(args: Array[String]) {
        val x = "AA"
        checkType(x)
    }

    def checkType(cls: AnyRef) {
        cls match {
            case String => println("is a String")
            case Date => println("is a Date")
            case _ => println("others")
        }
    }
}

代码无法编译,所以,不可能吗?检查类类型的scala方式是什么?是吗:

if(cls.isInstanceOf[String]) { ... }
else if(cls.isInstanceOf[Date]) { ... }
else { ... }

对吗?

【问题讨论】:

    标签: scala pattern-matching match


    【解决方案1】:

    然而,这编译:

    def checkType(cls: AnyRef) {                    
      cls match {                                 
        case s: String => println("is a String")
        case d: Date => println("is a Date")    
        case _ => println("others")             
      }                                                   
    }
    

    ...或简化版:

    def checkType(cls: AnyRef) =
      cls match {                                 
        case _: String => println("is a String")
        case _: Date => println("is a Date")    
        case _ => println("others")             
      }                                                   
    

    【讨论】:

    • 或者,甚至更简单:因为 match 产生一个值,所以将 println(...) 放在它周围并将大小写解析为适当的字符串。
    【解决方案2】:

    case 语句中的类型注释之前需要一个标识符。

    试试这个,它应该可以工作:

    object Main {
        def main(args: Array[String]) {
            val x = "AA"
            checkType(x)
        }
    
        def checkType(cls: AnyRef) {
            cls match {
                case x: String => println("is a String:"+ x)
                case x: Date => println("is a Date:" + x)
                case _ => println("others")
            }
        }
    }
    

    【讨论】:

    • 我喜欢这个答案,因为在 case 子句中(在这个 sn-p 'cls' 中)对检查的值做任何事情是不可能的,除非它被赋予一个特殊的 _ 以外的名称。在许多情况下,您希望根据对象的类型对其采取行动,而这个答案非常适合该用例。重要的是……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多