业余时间学了学Scala,至今有3个多月了...这两天看到群(54813143)里有同学讨论AOP,于是就想出了如下实现;
见代码及注释,欢迎喜欢Scala的同学一起讨论:
//trait里没有任何抽象的值或方法
trait AOP{
private var targets=List[Function1[String,Any]]() //List里放的都是函数对象
private val placeholder="" //无意义,用来调用函数对象的
def before=println("before...")
def after=println("after...")
def invoke(target:Function1[String,Any])={ //参数是个函数对象
before
target(placeholder) //什么时候调用,自己放置顺序
after
}
def add(t:Function1[String,Any])= targets=t::targets //收集所有被拦截的方法(函数对象)
def invokeAll()={
before
targets.reverse.foreach(t=>t(placeholder)) //reverse:保证调用的顺序(FIFO)
after
//这里需要一个清空targets的方法,就不写了
}
}
class Write extends AOP{
def writeOne(x:String,y:String)(placeholder:String)={ //curry化,最后一个placeholder算是冗余参数
println("one working..."+x+y)
}
def writeTwo(x:String,y:String,z:String)(placeholder:String)={
println("two working..."+x+y+z)
}
}
val w=new Write()
w.invoke(w.writeOne("hello"," world")_) //拦截的方式,使用了偏应用函数
w.add(w.writeOne("hello"," world")_) //收集
w.add(w.writeTwo("hello"," world"," more")_) //再收集
w.invokeAll //统一拦截
这里只是给喜欢Scala的同学一个思路,期望在此思路上进行扩展。
是不是很优雅? 还在等什么,快快加入到Scala的学习队伍中来吧。
分享到:
相关推荐
在 Scala 中使用 Aspects4s 实现AOP通常包括以下步骤: 1. **定义切点(Joinpoint)**:确定需要插入切面的代码位置,这可能是一个方法调用、类初始化等。切点通过正则表达式或自定义条件来指定。 ```scala import...
总结来说,`glicko2-scala`项目为Scala开发者提供了一种实现Glicko2评级系统的解决方案,结合了Glicko2的精妙算法和Scala的编程优势,适用于各种竞技游戏环境。通过理解和应用该项目,开发者能够更好地理解和管理...
Scala:Applied Machine Learning by Pascal Bugnion English | 23 Feb. 2017 | ISBN-13: 9781787126640 | 1843 Pages | EPUB/PDF (conv) | 33.15 MB Leverage the power of Scala and master the art of building, ...
"Scala: Guide for Data Science Professionals (Learning Path)" ASIN: B06XCJVY21, eISBN: 1787282856 | 2017 | True PDF | 1100 pages | 15 MB Scala will be a valuable tool to have on hand during your data...
在广告流量实时统计中,Scala常常与Apache Spark结合使用。Spark提供了一套分布式计算框架,能够高效地处理大规模数据流。它支持Scala API,使开发者能够快速构建高性能的数据处理应用程序。 3. **Apache Spark** ...
在"scala: scala代码"的描述中,我们可以推测这是一个关于Scala编程语言的学习资源或者项目源代码。 1. **面向对象编程**:Scala是基于Java虚拟机(JVM)的语言,因此它兼容Java的所有类库。它支持类、对象和继承等...
【课程大纲】第1讲-Spark的前世今生第2讲-课程介绍、特色与价值第3讲-Scala编程:基础语法第4讲-Scala编程:条件控制与循环第5讲-Scala编程:函数入门第6讲-Scala编程:函数入门之默认参数和带名参数第7讲-Scala编程...
"chess-game-scala" 这个标题明确指出了我们要讨论的是一个使用Scala编程语言实现的象棋游戏项目。"scala" 是关键标签,表明这个项目是用Scala这一现代、函数式编程语言编写的。通过标题我们可以预见到,这个项目将...
Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine by Venkat Subramaniam Scala is an exciting, modern, multi-paradigm language for the JVM. You can use it to write ...
用Scala编程语言实现各种算法 如何使用此存储库进行学习? 在本地计算机上克隆存储库 git clone https://github.com/TheAlgorithms/Scala.git 使用IDE(最好是IntelliJ)打开存储库 启用自动导入以从build.sbt...
《ddd-on-scala:Scala中的领域驱动设计实践》 领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法,旨在通过深入理解和表达业务领域,来构建复杂的软件系统。在Scala这一强大的函数式编程语言中,...
将org.plotly-scala::plotly-almond:0.8.1依赖项添加到笔记本中。 (最新版本:)然后初始化plotly-scala,并像使用它一样使用它 import $ivy . `org.plotly-scala::plotly-almond:0.8.1` import plotly . _ import
Testcontainers-scala 用于Scala包装器,允许使用容器进行功能/... 行动中的Testcontainers-scala: ://dimafeng.com/2016/08/01/testcontainers-selenium/松弛设置对于scalatest用户: libraryDependencies + = " ...
7. **代理模式**:Scala可以通过实现相同接口的匿名类或者使用特质来创建代理对象,实现代理模式,提供额外的功能或控制。 8. **策略模式**:在Scala中,策略模式通常通过定义一系列算法策略的特质,然后在运行时...
gRPC支持多种编程语言,包括Java、Go、Python等,而在这个场景中,我们将关注如何使用Scala和ScalaPB来构建gRPC服务。 **一、gRPC与ScalaPB** 1. **gRPC**:gRPC的核心概念是定义服务和消息类型,这些定义被存储在...
将使用编译为 JavaScript 的文件导入您的应用程序。 安装 ember install:addon ember-cli-scala 用法 app/scala/Robot.scala : package robot import scala . scalajs . js import js . annotation . JSExport @...
在这个项目中,可能使用了Scala宏来扩展语言,实现从逻辑表达式到Scala代码的转换。 "curryhoward"项目中的文件"curryhoward-master"很可能是项目源代码的主分支或主版本,包含了项目的完整结构和实现。这个文件...
vertx-lang-scalaCI结构vertx-lang-scala:包含实际语言实现的主模块vertx-lang-scala-stack:所有当前可用的模块vertx-lang-scala-on-the-fly:一种编译器实现,允许从源/类路径编译Scala代码。
C.scala:C 的浅层 DSL 该项目为核心 C 语言定义了一个 Scala 库和一些有用的 C 库。 它还提供了 Scala 集合的实现,例如 C DSL 中的 HashMap 或 List。 安装 浅层 C 定义伴随着使用 JNI 的实现。 sbt compile将...