'result should have length 3':ScalaTest DSL 是如何工作的?
'result should have length 3': How does the ScalaTest DSL work?
ScalaTest 允许您编写如下代码:
result should have length 3
进行此解析的幕后情况是什么?它只是使用中缀符号吗,即它是
result.should(have).length(3)
通过一些涉及隐式的魔法?还是发生了更复杂的事情?
你完全正确:隐式 + 中缀语法很神奇。
让我们拆开你的例子。在
result should have length 3
表达式result
(通常)没有方法should
。然而,如果你 mixin Matchers, then you get the implicit conversion convertToAnyShouldWrapper
, which returns an AnyShouldWrapper。 AnyShouldWrapper
现在有一个重载方法 should
。
should
的一个版本采用 HaveWord as argument, and returns a weird thing called ResultOfHaveWordForExtent. The ResultOfHaveWordForExtent
now has a length
method, which takes a Long
, and finally returns an Assertion。
因此,您的语句被脱糖为:
convertToAnyShouldMatcher(result).should(have).length(3)
请注意,方法调用和参数在此链中交替出现。因此,如果您不确定它是 should be
还是 shouldBe
之类的东西,只需计算表达式,然后查看您要提供的下一个参数是奇数还是偶数。
ScalaTest 允许您编写如下代码:
result should have length 3
进行此解析的幕后情况是什么?它只是使用中缀符号吗,即它是
result.should(have).length(3)
通过一些涉及隐式的魔法?还是发生了更复杂的事情?
你完全正确:隐式 + 中缀语法很神奇。
让我们拆开你的例子。在
result should have length 3
表达式result
(通常)没有方法should
。然而,如果你 mixin Matchers, then you get the implicit conversion convertToAnyShouldWrapper
, which returns an AnyShouldWrapper。 AnyShouldWrapper
现在有一个重载方法 should
。
should
的一个版本采用 HaveWord as argument, and returns a weird thing called ResultOfHaveWordForExtent. The ResultOfHaveWordForExtent
now has a length
method, which takes a Long
, and finally returns an Assertion。
因此,您的语句被脱糖为:
convertToAnyShouldMatcher(result).should(have).length(3)
请注意,方法调用和参数在此链中交替出现。因此,如果您不确定它是 should be
还是 shouldBe
之类的东西,只需计算表达式,然后查看您要提供的下一个参数是奇数还是偶数。