繁体   English   中英

Scala奇怪的方法调用语法

[英]Scala strange method invocation syntax

我正在浏览Specs2快速入门指南,并迅速发现一些我不熟悉的语法:

"The 'Hello world' string" should {
 // more stuff here
}

深入查看specs2源,我看到shouldDescribed(s: String)类的方法。 此外, Described似乎是在类定义之前隐式实例化的(作为described的方法?):

implicit def described(s: String): Described = new Described(s)
class Described(s: String) {
  def should(fs: =>Fragment) = addFragments(s, fs, "should")
}

我不明白:

  1. 这个隐式实例化是关于什么的
  2. 世界上正在使用这种语法: "some string" should { ... } 例如,一个字符串,然后一个方法调用(天真这只是对我来说很有意义,如果should是String类的方法。

我实际上碰到了这种模式,似乎可以回答我的问题: Pimp my Library模式使用了我不熟悉的这种隐式转换模式。 开放以防万一缺少任何重要见解,并且因为该文章是Odersky在大约十年前撰写的。

看来您已经回答了自己的问题,但我会发布更多详细信息。

“ Pimp my Library”的名称已替换为“ Enriched Library”(出于某种原因,可能不需要解释,尽管我承认,当我初次了解如何配置图书馆时,我笑了起来。)

Scala中的隐式做3件事:

  • 允许从一种类型隐式转换为另一种类型
  • (基于以上所述)允许您以非全局方式安全地扩展现有类。
  • 允许按类型而不是按名称传递值。

隐式扩展方法模式已在Scala 2.10中更正式化。 您问题中的上述示例可以更简洁地编写为隐式值类:

implicit class Described(s: String) {
  def should(fs: =>Fragment) = addFragments(s, fs, "should")
}

我知道编译器还将为隐式值类发出更有效的代码,因为它可以跳过包含扩展方法的包装器类的分配。 参见http://www.blog.project13.pl/index.php/coding/1769/scala-2-10-and-why-you-will-love-implicit-value-classes/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM