官术网_书友最值得收藏!

Extending functions

Nothing prevents a developer from extending a FunctionN trait the same way it is done with PartialFunction, though it seldom makes sense because of the limitations imposed by the referential transparency constraint. This means that such an implementation of the function should not have a shared state, nor should it mutate state. 

It might be tempting, for example, to implement a loaner pattern as a function, so that a used resource would be automatically closed after function application, but it won't be referentially transparent and thus won't satisfy the requirements for a function.

Here is how the implementation could look:

class Loan[-T <: AutoCloseable, +R](app: T => R) extends (T => R) {
override def apply(t: T): R = try app(t) finally t.close()
}

And this is what happens if we call it:

scala> new Loan((_: java.io.BufferedReader).readLine())(Console.in)
res13: String = Hello

scala> [error] (run-main-0) java.io.IOException: Stream Closed
[error] java.io.IOException: Stream Closed
[error] at java.io.FileInputStream.read0(Native Method)
[error] at java.io.FileInputStream.read(FileInputStream.java:207)
[error] at jline.internal.NonBlockingInputStream.read(NonBlockingInputStream.java:245)
...

Unfortunately, it is not even possible to test whether the second call would produce the same result (obviously it will not) because we broke the REPL by closing the Console.in.

主站蜘蛛池模板: 巍山| 都江堰市| 怀仁县| 定西市| 临安市| 绥芬河市| 灌云县| 安国市| 天全县| 肇州县| 桑日县| 栾城县| 金山区| 山阴县| 寿阳县| 乌恰县| 施秉县| 松阳县| 通化市| 崇仁县| 日土县| 桂东县| 栾川县| 山西省| 柳河县| 康乐县| 拜城县| 布尔津县| 平安县| 金坛市| 新绛县| 阿合奇县| 来安县| 阿城市| 南昌县| 石棉县| 九龙县| 永新县| 绥阳县| 吉木萨尔县| 砚山县|