对Prgramming in Scala 2nd的第20章“汇率”的例子进行了整理,添加了部分注释。
只能说:抽象类型很好很强大!
/**
* 通过抽象类型的延迟实现,达到一种安全的类型操作
*/
object TestCurrency extends Application{ //客户端代码入口
val ret1=Japan.Yen from US.Dollar * 100
val ret2=Europe.Euro from ret1
val ret3=US.Dollar from ret2
println(ret1) //12110 JPY
println(ret2) //75.95 EUR
println(ret3) //99.95 USD 转换之后基本等同于原来的100USD,毕竟转换关系并不精确
println(US.Dollar*100+ret3) //199.95 USD
//println(US.Dollar+Europe.Euro) //good!!compile error: type mismatch; this is what we want
println(US.Dollar*100) //100.00 USD
println(Japan.Yen*100) //100 JPY
}
abstract class CurrencyZone{
type Currency <: AbstractCurrency //定义汇率类型上界
val CurrencyUnit:Currency //汇率单位
def make(x:Long):Currency //工厂方法,其实现推迟到具体子类
abstract class AbstractCurrency{ //抽象内部类
val amount:Long //数量 -抽象的
def designation:String //汇率名称 -抽象的
def +(that:Currency):Currency=make(this.amount+that.amount)
def -(that:Currency):Currency=make(this.amount-that.amount)
def *(x:Double):Currency=make((this.amount*x).toLong)
def /(that:Double)=make((this.amount/that).toLong)
def /(that:Currency)=this.amount.toDouble/that.amount
//from:从other转到当前(调用方)汇率
def from(other:CurrencyZone#AbstractCurrency):Currency= //路径依赖类型:CurrencyZone#AbstractCurrency
make(math.round(
other.amount.toDouble*Converter.exchangeRate(other.designation)(this.designation)))
//10^x ~= n , 返回x
private def decimals(n:Long):Int=
if(n==1) 0 else 1+decimals(n/10)
//重写:formatted的作用是根据单位来决定小数点后的位数
override def toString=((amount.toDouble/CurrencyUnit.amount)
formatted ("%."+ this.decimals(CurrencyUnit.amount)+"f")+" "+this.designation)
}
}
object US extends CurrencyZone{
abstract class Dollar extends AbstractCurrency{
def designation="USD" //抽象的designation在此实现
}
type Currency=Dollar //类型延迟实现,可避免不同币种的直接运算
def make(cent:Long)=new Dollar{
val amount=cent //抽象的amount在此实现
}
val Cent=make(1)
val Dollar=make(100)
val CurrencyUnit=Dollar
}
object Europe extends CurrencyZone{ //同US单例
abstract class Euro extends AbstractCurrency{
def designation="EUR"
}
type Currency=Euro
def make(cents:Long)=new Euro{ val amount=cents }
val Cent=make(1)
val Euro=make(100)
val CurrencyUnit=Euro
}
object Japan extends CurrencyZone{ //同US单例
abstract class Yen extends AbstractCurrency{
def designation="JPY"
}
type Currency=Yen
def make(yen:Long)=new Yen{val amount=yen}
val Yen=make(1) //日圆的的最小单位,没有日分
val CurrencyUnit=Yen
}
object Converter{ //不同汇率间的转换关系(这个数据结构不错:)
var exchangeRate =
Map(
"USD" -> Map("USD" -> 1.0 , "EUR" -> 0.7596,
"JPY" -> 1.211 , "CHF" -> 1.223),
"EUR" -> Map("USD" -> 1.316 , "EUR" -> 1.0 ,
"JPY" -> 1.594 , "CHF" -> 1.623),
"JPY" -> Map("USD" -> 0.8257, "EUR" -> 0.6272,
"JPY" -> 1.0 , "CHF" -> 1.018),
"CHF" -> Map("USD" -> 0.8108, "EUR" -> 0.6160,
"JPY" -> 0.982 , "CHF" -> 1.0 )
)
}
分享到:
相关推荐
在"scala: scala代码"的描述中,我们可以推测这是一个关于Scala编程语言的学习资源或者项目源代码。 1. **面向对象编程**:Scala是基于Java虚拟机(JVM)的语言,因此它兼容Java的所有类库。它支持类、对象和继承等...
【课程大纲】第1讲-Spark的前世今生第2讲-课程介绍、特色与价值第3讲-Scala编程:基础语法第4讲-Scala编程:条件控制与循环第5讲-Scala编程:函数入门第6讲-Scala编程:函数入门之默认参数和带名参数第7讲-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编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
**Scala 专题教程 - 抽象成员** 在 Scala 编程语言中,抽象成员是面向对象编程中的一个重要概念,它们允许我们定义一个类或特质,其中包含未实现的方法或字段。这种机制使得我们可以创建规范化的接口,而具体的实现...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得开发者能够在同一平台上享受到两者的优点。...无论是初学者还是经验丰富的开发者,这些实例都将为你的Scala学习之路提供宝贵的实践经验。
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
Scalaz 是一个强大的 Scala 库,提供了许多函数式编程工具,包括类型类、Monads 和高阶抽象。虽然 Scalaz 并非专门为 AOP 设计,但它的一些特性可以用来实现类似的功能,比如使用 Scalaz 的拦截器(Interceptor)或 ...
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
将org.plotly-scala::plotly-almond:0.8.1依赖项添加到笔记本中。 (最新版本:)然后初始化plotly-scala,并像使用它一样使用它 import $ivy . `org.plotly-scala::plotly-almond:0.8.1` import plotly . _ import
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...
cs109ui 一个模块 CS109UI,允许学生使用图形...我在关于 Scala Swing 的教程的示例代码。 例子 我的 Scala 文档页面的通用示例代码位于 教程 我在CS109 教程中使用的代码片段 项目 CS109 项目的数据文件和启动代码。
Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...