理解特质中的内部类

时间:2016-11-18 14:54:34

标签: scala

我对Scala很陌生,现在我正在努力学习如何在Scalatest中编写测试。以下是使用自定义匹配器部分的示例they provided

import org.scalatest._
import matchers._

trait CustomMatchers {

    class FileEndsWithExtensionMatcher(expectedExtension: String) extends Matcher[java.io.File] {
        def apply(left: java.io.File) = {
            val name = left.getName
            MatchResult(
                name.endsWith(expectedExtension),
                s"""File $name did not end with extension "$expectedExtension"""",
                s"""File $name ended with extension "$expectedExtension"""""
            )
        }
    }

def endWithExtension(expecedExtension: String) = new FileEndsWithExtensionMatcher(expectedExtension)

}

// Make them easy to import with:
// import CustomMatchers._
object CustomMatchers extends CustomMatchers

我不太明白他们把FileEndsWithExtensionMatcher课变成特质的原因?为什么?它是惯用的scala方式还是一些?你能解释一下吗?

2 个答案:

答案 0 :(得分:3)

这只是为了您的方便。 这是模块化代码的众多方法之一,而不是在所需的套件中重用它。您可以在包或对象中组织它,它也可以工作。使用这种方法,可以很容易地将特征混合到您的测试中。更重要的是,它可以让你很好地组织连接的匹配器。

例如,您可以使用一组货币匹配器和另一个匹配物理单位的特征创建特征。接下来,您可以将一个或两个特征混合到您的测试中。

答案 1 :(得分:2)

这里的目的是“将所有匹配器放在一个可以通过其他代码轻松访问它们的位置”。您可以将所有这些特征放入包中并导入该包。但是您引用的链接指出“组织自定义匹配器的一个好方法是将它们置于一个或多个特征中,然后可以将它们混合到需要它们的套件中”。无论哪种方式都可以。这只是一个偏好问题。