Scala学习笔记(五):Trait(特质)

Trait 的一个主要用法,将一个瘦接口变成胖接口

 

复制代码
trait Philosophical{
    def philosophize(){
        println("here")
    }
}

class Forg extends Philosophical{
    override def toString="green"
}

val forg=new Forg
forg.philosophize
复制代码

 

typeclass模式

 

复制代码
trait Tellable[T] {
  def tell(t: T): String
}

case class Color(descript: String)

case class Person(name: String)

object colorTeller extends Tellable[Color] {
    def tell(t: Color): String = "I am color "+t.descript
}

val personTeller = new Tellable[Person] {
    def tell(t: Person): String = "I am "+ t.name
}

def tell[T](t: T)(M: Tellable[T]) = {
    M.tell(t)
}
复制代码

应用:

tell(Color("RED"))(colorTeller)

tell(Person("John"))(personTeller)

 

应用implicit

 案例一:

复制代码
object TestTrait {
  
  trait Tellable[T] {
    def tell(t: T): String
  }

  case class Color(descript: String)

  implicit object colorTeller extends Tellable[Color] {
    def tell(t: Color): String = "I am color "+t.descript

  }

  def main(args: Array[String]): Unit = {
    
    import colorTeller._

    println(tell(Color("RED")))
  }
}
复制代码

 

案例二:

复制代码
  trait Monoid[A] {
    def mappend(a1: A, a2: A): A

    def mzero: A
  }

  implicit object intMonoid extends Monoid[Int] {
    def mappend(i1: Int, i2: Int): Int = i1 + i2

    def mzero = 0
  }

  implicit object stringMonoid extends Monoid[String] {
    def mappend(s1: String, s2: String): String = s1 + s2

    def mzero = ""
  }

  def sum[A](xs: List[A])(implicit m: Monoid[A]): A = xs.foldLeft(m.mzero)(m.mappend)

  //> sum: [A](xs: List[A])(implicit m: scalaz.learn.ex2.Monoid[A])A
  sum(List(1, 2, 3)) //> res0: Int = 6
  sum(List("Hello,", " how are you")) //> res1: String = Hello, how are you
复制代码

 

Application Trait

Scala提供了特质scala.Application,在单例对象名后面写上“extends Application”,把想要执行的代码直接放在单例对象的花括号之间

import ChecksumAccumulator.calculate

object FallWinterSpringSummer extends Application {

for (season <- List("fall", "winter", "spring"))
  println(season +": "+ calculate(season))
}

能这么做,是因为特质Application声明了带有合适签名的main方法,并被你写的单例对象继承

花括号之间的代码被收集进了单例对象的主构造器,并在类初始化时执行

 

优点:

1.可以减少一些输入工作

 

缺点:

1.不能访问命令行参数

 

Ordered Trait

 

 
posted @   时空穿越者  阅读(477)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示