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

 

Scala学习笔记(七):Application特质的更多相关文章

  1. [Scala]Scala学习笔记七 正则表达式

    1. Regex对象 我们可以使用scala.util.matching.Regex类使用正则表达式.要构造一个Regex对象,使用String类的r方法即可: val numPattern = &q ...

  2. scala 学习笔记七 基于类型的模式匹配

    1.介绍 Scala 提供了强大的模式匹配机制,应用也非常广泛. 一个模式匹配包含了一系列备选项,每个都开始于关键字 case.每个备选项都包含了一个模式及一到多个表达式.箭头符号 => 隔开了 ...

  3. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  4. go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)

    目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...

  5. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  7. Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API

    Self-Host   寄宿Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台.Windows Forms 应用.WPF 应用甚至是Wind ...

  8. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  9. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

  10. Go语言学习笔记七: 函数

    Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...

随机推荐

  1. 修复 Java 内存模型,第 1 部分——Brian Goetz

    转自Java并发大师Brain Goetz:http://www.ibm.com/developerworks/cn/java/j-jtp02244/ (中文地址) http://www.ibm.co ...

  2. Servlet/JSP-01 Servlet及其生命周期

    一.起步 1.新建一个类继承Servlet接口 public class HelloServlet implements Servlet { @Override public void destroy ...

  3. 【DPDK】虚拟机开发环境配置

    DPDK介绍见:www.dpdk.org 本文介绍的步骤基本适用于dpdk 1.7.0 - dpdk 2.0.0 各版本.只是setup.sh显示的菜单有一些小的不同:同样的,也适用于ubuntu更高 ...

  4. Linux学习之七——乱码的解决方案

    一.乱码的原因 乱码是编码不统一引起的,有下面一些地方需要注意 1. Linux 系统默认支持的语系数据:这与 /etc/sysconfig/i18n 有关:2. 你的终端界面 (bash) 的语系: ...

  5. Sql 随机更新一条数据返回更新数据的ID编号

    DECLARE @parimaryTable(临时表)  Table(prizecode varchar(50)); update top (1)  数据表 set 字段a='数值' ,字段b=‘数值 ...

  6. UESTC 876 爱管闲事 --DP

    题意:即求给定n个数字(a1,a2,……an),不改变序列,分成M份,使每一份和的乘积最大. 思路:dp[i][j]表示把前i个数字,分成j份所能得到的最大乘积. 转移方程:dp[i][j] = ma ...

  7. Mango Weekly Training Round #3 解题报告

    A. Codeforces 92A Chips 签到题.. #include <iostream> #include <cstdio> #include <cstring ...

  8. HDU 3487 Play with Chain 【Splay】

    1-n的序列,有两种操作: 1,将一段区间翻转 2,将一段区间切下来放到剩余序列的第C个数后 采用延迟更新的方法维护区间的翻转,并维护一个size域. 添加一个最大点和一个最小点,防止出界 翻转时,将 ...

  9. 伪造Http头拿flag

    <?php function GetIP(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])) $cip = $_SERVER["HT ...

  10. sqlzoo.net刷题3

    Find the continents where all countries have a population <= 25000000. Then find the names of the ...