【问题标题】:Scala "fluent" style programmingScala“流利”风格的编程
【发布时间】:2015-06-21 06:10:39
【问题描述】:

我正在从“不耐烦的 Scala”一书中学习 Scala。书中的一节用以下代码 sn-p 说明了“流利”的编程风格:

object Title

class Document {
  private var useNextArgAs: Any = null
  def set(obj: Title.type): this.type = { useNextArgAs = obj; this }
  def to(arg: String) = if (useNextArgAs == Title) title = arg; else ...
}

然后作者进行如下方法调用:

book set Title to "Scala for the Impatient"

这里有一些问题:

  1. 为什么useNextArgAs 输入Any?在示例中用于useNextArgAs 的唯一类型是Title。你能展示一个使用Any 代替Title 的用例吗?
  2. 方法set返回this但返回类型是this.type,而不是Documentthis 不应该是实例吗?
  3. 在方法to中,title = arg指的是不存在的变量title?它是从哪里来的?

【问题讨论】:

  • 本书专注于 Scala,并在没有警告的情况下展示了可变 varAny 类型的示例?
  • @cchantep “对于不耐烦的人”是一个线索 :) 来自亚马逊评论 A java programmer after reading this book will only write scala in a java style of programming. That's not what we want. We need developers who can think and program in scala way.
  • 我不同意写这篇评论的人。我有 3 本书关于 Scala,“不耐烦的 Scala”、“学习 Scala”和“Scala 编程”,恕我直言,“不耐烦……”是其中最好的。它有必要的深度,但不会让你入睡。也许审阅者没有完成练习,这就是他们错过重点的地方。练习与课程一样重要,因为每个问题都会让你思考。我看到太多人对“scala 方式”的吹捧过于松散,而没有解释这对他们意味着什么,如果有的话。免责声明:作者不向我付款。

标签: scala types fluent method-chaining


【解决方案1】:

可以在github 中找到(Spoiler Alert!)书中此练习的可能(不完全正确)实现

此示例来自第 18 章,其难度级别为“高级 Lib Designer”。在这个级别上,一个人应该很清楚重用和可扩展性问题,以及 scala 中可变状态的后果。 这绝对不是初学者的技术。

对于 OP 的问题:

1) 为什么 useNextArgAs type Any? --- 使其支持 Document 子类中的任意属性类型。 Document 未声明 final

2) 方法集返回 this 但返回类型是 this.type --- 参见下面 Alvin Alexander 的文章(你可能在“不耐烦的 Scala”中有解释)

this.type 明确设置为您的 set* 方法的返回类型 确保流利的风格将继续在您的子类中工作

考虑以下扩展并尝试使用 set()to() 返回类型和值

class Book extends Document {
  def bind :this.type = {/*do something*/; this}
}

val book = new Book
(book set Title to "Scala for the Impatient").bind

3) 不存在的 var title --- 它是 Document 中的可变字段,只是在提供的代码 sn-p 中缺少

关于这个主题的一些额外阅读:

【讨论】:

  • 2) 让我换个方式提出问题。我理解返回类型 this.type 背后的原因,这在书中也有解释。我要问的是返回类型指定为this.type,但返回this。我期待 this.type 被退回。
  • 您需要返回this 进行链接,但您不能只使用this 作为类型。如果您将类型硬编码为具体类(在这种情况下为Document)或让编译器推断它(在这种情况下为Document) - 如果没有显式类型转换,您将无法在子类上链接方法。所以this.type 是唯一可行的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 2011-08-24
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
相关资源
最近更新 更多