Scala 一些列表规格2匹配器

Scala 一些列表规格2匹配器,scala,specs2,Scala,Specs2,为什么下面的方法不起作用 Some(List()) must beSome(Nil) “Some(List())”是Some,但List()不等于“org.specs2.matcher.ValueChecks$$anon”$3@480ba116“注意 Some(List()) must beSome(List()) 也不行 'Some(List())' is Some but List() is not equal to 'org.specs2.matcher.ValueChecks$

为什么下面的方法不起作用

Some(List()) must beSome(Nil)
“Some(List())”是Some,但List()不等于“org.specs2.matcher.ValueChecks$$anon”$3@480ba116“

注意

Some(List()) must beSome(List())
也不行

 'Some(List())' is Some but List() is not equal to 
 'org.specs2.matcher.ValueChecks$$anon$4@48d1978f' 
 Actual:   List()
 Expected: org.specs2.matcher.ValueChecks$$anon$4@48d1978f
所以问题不是
Nil

我们知道我们真正做的是:

 Some(List()).must(beSome(List()))
问题似乎出在
beSome
上。让我们看看beSome返回了什么:

val bl = beSome(List())  // SomeCheckedMatcher[Int]
val bn = beSome(Nil)     // SomeCheckedMatcher[Int]
由于返回类型类似于正在检查整数的选项,因此这种情况不正确:

val b = beSome(2)        // SomeCheckedMatcher[Int]
这些不是我们的目标类型:

val myList = List()  // myList: List[Nothing] = List()
val myList2 = Nil    // myList2: scala.collection.immutable.Nil.type = List()
那么,怎么了

查看,您可以使用以下方法:

  • beSome
    检查某个元素是否为
    Some()

  • beSome(exp)
    检查元素是否为
    Some(exp)

  • beSome(matcher)
    检查a满足匹配器的元素是否是
    Some(a)

  • beSome(函数:A=>AsResult[B])
    检查元素是否是
    Some(A)
    ,其中
    函数(A)
    返回一个成功的
    结果(注意
    a
    Seq[a]
    也是一个函数
    Int=>a
    序列包含在一些需要使用匹配器的文件中:
    beSome(==(Seq(1))

最后一种选择似乎是我们这里的问题。请注意,
List()
类似于
Seq
,一个来自Int=>a的函数。在我们的示例中:

val myList = List()                 // myList: List[Nothing] = List()
val func: Int => Nothing = myList   // func: Int => Nothing = List()
要解决这个问题,我们应该使用matcher(文档的第三个备选方案):


您是否尝试过这样的操作:Some(List[TYPE].empty)必须是Some(List[TYPE].empty),即显式使用类型构造函数来创建给定类型的列表?我确认
Some(List[Int]())必须是Some(List[Int]())
工作正常。
Some(List()) must beSome(beEqualTo(List()))
Some(List()) must beSome(beEqualTo(Nil))

// or 

Some(List()) must beSome(be_==(List()))  
Some(List()) must beSome(be_==(Nil))