加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么Scala API有两种组织类型的策略?

发布时间:2020-12-16 09:52:22 所属栏目:安全 来源:网络整理
导读:我注意到 Scala标准库使用两种不同的策略来组织类,特征和单例对象. 使用其成员为导入的包.例如,您可以访问scala.collection.mutable.ListBuffer.这种技术很熟悉来自Java,Python等. 使用特征的类型成员.例如,这是您如何访问Parser类型.首先需要混合使用scala.
我注意到 Scala标准库使用两种不同的策略来组织类,特征和单例对象.

>使用其成员为导入的包.例如,您可以访问scala.collection.mutable.ListBuffer.这种技术很熟悉来自Java,Python等.
>使用特征的类型成员.例如,这是您如何访问Parser类型.首先需要混合使用scala.util.parsing.combinator.Parsers.这种技术不熟悉来自Java,Python等,并且在第三方库中使用不多.

我猜(2)的一个优点是它组织了方法和类型,但是根据Scala 2.8的包对象,可以使用(1)完成相同的操作.为什么要有这两种策略?什么时候应该使用?

解决方法

这里注释的命名是 path-dependent types.这是你所说的2号选项,我只会说它.除非您碰巧遇到问题,否则您应该始终选择1号选项.

您错过的是Parser类引用了Parsers类中定义的内容.实际上,Parser类本身取决于在Parsers上定义的输入:

abstract class Parser[+T] extends (Input => ParseResult[T])

输入类型定义如下:

type Input = Reader[Elem]

而Elem是抽象的.例如,考虑一下RegexParsers和TokenParsers.前者将Elem定义为Char,而后者将其定义为Token.这意味着每个解析器都是不同的.更重要的是,因为Parser是Parsers的子类,Scala编译器将确保在编译时您没有将RegexParsers的Parser传递给TokenParsers,反之亦然.事实上,您甚至无法将RegexParsers的一个实例的Parser传递给它的另一个实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读