Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 什么是“允许写作的特质”?_Scala_Composition_Traits - Fatal编程技术网

Scala 什么是“允许写作的特质”?

Scala 什么是“允许写作的特质”?,scala,composition,traits,Scala,Composition,Traits,我正在深入阅读Scala一书的第一部分。在第一节中,它给出了一个将java JdbcTemplate接口转换为scala的示例: Java代码: public interface JdbcTemplate { List query(PreparedStatementCreator psc, RowMapper rowMapper) } Scala代码: trait JdbcTemplate { def query[ResultItem](psc : Connection =&g

我正在深入阅读Scala一书的第一部分。在第一节中,它给出了一个将java JdbcTemplate接口转换为scala的示例:

Java代码:

public interface JdbcTemplate {
  List query(PreparedStatementCreator psc,
    RowMapper rowMapper)
}
Scala代码:

trait JdbcTemplate {
  def query[ResultItem](psc : Connection => PreparedStatement,
                        rowMapper : (ResultSet, Int) => ResultItem) : List[ResultItem]
}
然后它说:

通过一些简单的转换,我们创建了一个直接针对函数的接口。这是一种功能性更强的方法,因为scala的功能特性允许组合。当您读完本书时,您将能够以完全不同的方式处理此界面的设计

我无法理解这里的组合,因为我在提供的示例中找不到任何组合

我遗漏了什么吗?

您的代码片段不是合成示例,但允许合成。事实上,一种特质本身只不过是……自身与自身:

Trait允许在运行时编写,这要归功于withkeyword。 基本上,它允许将trait的方法添加到关联的trait或类,甚至…运行时对象! 合成是一种运行时特性,它的主要优点和继承是一种编译特性,因此是静态的

下面是一个在运行时使用trait composition的示例:

val obj1 = new MyClass() with JdbcTemplate
//obj1.query .......
与Java相比,如果MySuperClass是一个类或抽象类,您仍然可以通过实现某种策略模式等在运行时从其他地方添加/更改行为。。。但是它需要你描述一个接口+实现..很无聊。 相反,Trait允许在一个地方定义方法

这就是为什么在scala中,据说trait允许组合,而且显然,函数式编程概念更适合组合而不是继承

更新-----------

@Alexlv是对的=>重要的一个词是Scala的功能特征。 我上面的解释仍然正确,但与作者想要表达的意思不符。 IMHO,他想说的是:Connection=>PreparedStatement是一个Function1,由于函数喜欢组合,所以它可以从函数编程字中提供一些很好的处理来生成所需的查询方法参数

您的代码段不是合成示例,但允许合成。事实上,一种特质本身只不过是……自身与自身:

Trait允许在运行时编写,这要归功于withkeyword。 基本上,它允许将trait的方法添加到关联的trait或类,甚至…运行时对象! 合成是一种运行时特性,它的主要优点和继承是一种编译特性,因此是静态的

下面是一个在运行时使用trait composition的示例:

val obj1 = new MyClass() with JdbcTemplate
//obj1.query .......
与Java相比,如果MySuperClass是一个类或抽象类,您仍然可以通过实现某种策略模式等在运行时从其他地方添加/更改行为。。。但是它需要你描述一个接口+实现..很无聊。 相反,Trait允许在一个地方定义方法

这就是为什么在scala中,据说trait允许组合,而且显然,函数式编程概念更适合组合而不是继承

更新-----------

@Alexlv是对的=>重要的一个词是Scala的功能特征。 我上面的解释仍然正确,但与作者想要表达的意思不符。
IMHO,他想说的是:Connection=>PreparedStatement是一个Function1,由于函数喜欢组合,所以它可以从函数编程字中提供一些很好的处理来生成所需的查询方法参数

您错过了这个短语的第一部分:

scala的功能特性允许合成


在scala函数中,函数是一个简单的对象,它由一个类似于特征的函数[-T,+R]构造而成,在所有这些特征上,你有两种方法:和和和组合。

你错过了这个短语的第一部分:

scala的功能特性允许合成


在scala中,函数是一个简单的对象,由类似于trait的函数[-T,+R]构造而成,在所有这些trait上,您有两种方法:and then和compose。

作者的观点是,用函数类型替换PreparedStatementCreator和RowMapper会产生更具功能性的API!。该API更好地支持代码重用,因为psc和rowMapper函数可以由简单的功能组件组成。例如,您可能具有过滤结果集、提取各种数据片段、转换数据映射、聚合数据映射等功能


正如@Alexiv所指出的,所有Scala函数对象通过各种函数特性提供了支持函数组合的andThen和COMPRESS方法。

作者的观点是,用函数类型替换PreparedStatementCreator和RowMapper会产生一个更具功能性的API!。该API更好地支持代码重用,因为psc和rowMapper函数可以由简单的功能组件组成。你可能会玩得很开心 例如,过滤结果集、提取各种数据片段、转换数据映射、将其聚合等操作


正如@Alexiv所指出的,所有Scala函数对象都通过各种函数特性提供了支持函数组合的andThen和COMPRESS方法。

也许示例中没有使用组合,但是允许合成。我猜他们的意思是合成中的特质混合可能这个词应该存在?可能这个例子没有使用合成,但允许合成。我猜他们的意思是合成中的特质混合可能这个词应该存在?有趣,但仍然不清楚。如果你能提供一个问题中给定代码的例子,这将是非常有趣的,但仍然不清楚。如果你能提供一个问题中给定代码的例子,那就太好了