Scala Structural Typing结构类型

鸭子类型:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

一般在动态语言里面才有,因为静态语言是强类型的,会在编译期检查类型,很难实现。但是Scala作为一门static type语言,居然支持,不得不说Scala确实很强大。直接上code

package testscala

object StructuralTyping extends App {
  def quacker(duck: {def quack(value: String): String}) {
    println(duck.quack("Quack"))
  }

  object BigDuck {
    def quack(value: String) = {
      value.toUpperCase
    }
  }

  object SmallDuck {
    def quack(value: String) = {
      value.toLowerCase
    }
  }

  object IamNotReallyADuck {
    def quack(value: String) = {
      "prrrrrp"
    }
  }

  quacker(BigDuck)
  quacker(SmallDuck)
  quacker(IamNotReallyADuck)

  //  object NoQuaker {
  //  }
  //
  //  quacker(NoQuaker) // 编译错误!!!!

  val x = new AnyRef {
    def quack(value: String) = {
      "No type needed " + value
    }
  }
  quacker(x)

}

不过Scala编译成Reflection实现,"

Why scala uses reflection to call method on structural type?

"。当然里面说性能差事反射的性能问题,随着JVM引入invokedynamic
 指令,会有很大的性能提升,但是这只在JVM1.7才有,但是scala2.11还支持JVM1.6,
所以最好还是不要大量使用,当然目前貌似也没有太多使用的,可以看这篇文章“

Why No One Uses Scala’s Structural Typing

Ref

1. http://en.wikibooks.org/wiki/Scala/Structural_Typing

2. http://java.dzone.com/articles/duck-typing-scala-structural

3. http://www.draconianoverlord.com/2011/10/04/why-no-one-uses-scala-structural-typing.html

4. http://stackoverflow.com/questions/8539422/why-scala-uses-reflection-to-call-method-on-structural-type

时间: 2024-10-13 03:54:08

Scala Structural Typing结构类型的相关文章

Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/pR_4sY0cJLs/优酷:http://v.youku.com/v_show/id_

利用结构类型的相关知识计算两点之间的距离

#include<stdio.h>#include<stdlib.h>#include<math.h> struct point{ /*点的结构类型名*/ float x; /*横坐标*/ float y; /*纵坐标*/ }; struct point readPoint(); /*函数原型声明*/float distance(struct point p1,struct point p2);/*主函数*/ int main(void){ struct point a

一页中总结结构类型的设计模式

机构类型设计模式目录,之前的创建类型的设计模式介绍看这里 适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 1. 适配器模式(将某个类的接口转换成客户端期望的另一个接口表示.适配器模式可以消除由于接口不匹配所造成的类兼容性问题.)引用院子Learning hard的示例,比较经典的插头例子 using System; /// 这里以插座和插头的例子来诠释适配器模式 /// 现在我们买的电器插头是2个孔,但是我们买的插座只有3个孔的 /// 这是我们想把电器插在插座上的话就需

C 开发学习 - 结构类型(枚举/结构/类型定义)

一.枚举 定义:枚举是 一种用户定义的数据类型,它用的关键字 enum 枚举类型名字通常并不真的使用,要用的是在大括号里地名字,因为它们就是常量符合,它们的类型是int,值则依次从0到n. enum colors {red, yellow, green} 语法:enum 枚举类型名称{名字0m, ..., 名字n}; 案例一:自动计数的枚举 // // main.c // enum // // Created by liuxinming on 15/4/26. // Copyright (c)

[Effective JavaScript 笔记]第57条:使用结构类型设计灵活的接口

想象创建wiki的库.wiki网站包含用户可以交互式地创建.删除和修改的内容.许多wiki都以简单.基于文本标记语言创建内容为特色.通常,这些标记语言只提供了HTML可用功能的一个子集,但是却有一个更简单.更清晰的源格式.例如,环绕星号的文本被格式化为粗体,环绕下划线的被格式化为带有下划线的文本,环绕斜杠的被格式化为斜体.用记可以输入如下格式: this sentence contains a *bold phrase* within it. this sentence contains a _

[C语言]进阶|结构类型: 枚举, 结构, 类型定义

--------------------------------------------------------------------- 枚举: // main.c #include <stdio.h> const int red = 0; const int yellow = 1; const int green = 2; int main(int argc, const char * argv[]) { /* 常量符号化:用符号而不是具体的数字来表示程序中的数字; 这样看到符号才能知道背

Scala函数---既存类型

语法:Type ::= InfixType ExistentialClausesExistentialClauses ::= forSome { ExistentialDcl{semi ExistentialDcl} }ExistentialDcl ::= type TypeDcl| val ValDcl既存类型具有 T forSome {Q}的形式,Q是一个类型声明的序列(§4.3).设t1[tps1]>n<:Un是Q中声明的类型(任何类型参数部分[tpsi]都可以没有).每个类型ti的域都

《Go语言实战》Go 类型:基本类型、引用类型、结构类型、自定义类型

Go 语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么. 提前知道值的类型的好处有很多,比如编译器可以合理的使用这些值,可以进一步优化代码,提高执行的效率,减少 bug 等等. 基本类型 基本类型是 Go 语言自带的类型,比如 数值.浮点.字符串.布尔.数组 及 错误 类型,他们本质上是原始类型,也就是不可改变的,所以对他们进行操作,一般都会返回一个新创建的值,所以把这些值传递给函数时,其实传递

C++基础实例-结构类型(3)

struct #if 0 #include<iostream> using namespace std; main() { //定义结构类型 struct books { char title[20]; char author[15]; int pages; float price; } ; //声明结构变量 struct books Zbk={"VC++ ","Xc",295,35.5}; books Wbk; //对结构变量的输出 cout<&