`
tianshibaijia
  • 浏览: 1128820 次
文章分类
社区版块
存档分类
最新评论

16.2.1 使用 switch 函数

 
阅读更多

16.2.1 使用 switch 函数

我们首先来看这个示例,然后,再描述 switch 函数的实现。这里是它的类型,对于我们理解它,这是一个良好的开端:

val switch : Behavior<'T> -> IObservable<Behavior<'T>> -> Behavior<'T>

这个函数的结果是一个行为,表示随时间而变化的 'T 值。这意味着,这个函数以某种方式构造了一个行为,使用前两个参数值。第一个参数表示一个初始行为。在事件发生之前,返回的行为与作为第一个参数提供的将是一样的。

最有趣的方面是第二个参数,它是一个事件,携带 Behavior<'T> 类型的值。这意味着,每当触发事件时,它会产生可以使用的新行为,而不是以前(或初始)的行为。每当事件发生时,switch 函数(在幕后)将替换这个行为,将返回从事件中获得的行为。你可能会想,携带行为的事件是值,听起来有点复杂。如果我们想要从零开始,建立这样的事件,的确会棘手,但是,我们总是可以通过组合一些简单的值,创建一个复杂的值。

现在,我们知道 switch 函数要做什么了,让我们尝试使用它。清单 16.7 首先创建一个简单的、旋转的圆,类似于我们在第 15 章中看到的。然后,构造一个事件,当用户在窗体上单击时,会被触发,它携带一个新的行为:相同的动画,只是运行得更快。最后,它使用 switch 函数构建一个行为,每次单击时更改。

Listing 16.7 Animation with changing speed (F#)

let af = new AnimationForm(ClientSize = Size(400, 400), Visible=true)

let greenCircle = circle (forever Brushes.OliveDrab) 100.0f.forever
let rotatingCircle = rotate 100.0f 1.0f greenCircle

let circleEvent =
af.Click
|> Observable.map (always 0.1f)
|> Observable.scan (+) 0.0f
|> Observable.map (fun x -> faster x rotatingCircle)

let init = faster 0.0f rotatingCircle
af.Animation <- switch init circleEvent

清单 16.7 首先创建一个标准的行为 rotatingCircle,表示动画,是恒速旋转的、绿色圆圈。下一步,它构造了产生新的行为事件。我们用了计数点击按钮时所做的同样技巧,创建一个将产生指定速度的事件,每次单击时,递增速度。最后,在流操作中调用 Observable.map,把携带速度的事件转换成携带行为的事件。它改变了原始旋转圆速度,通过每次调用 faster 函数,新的速度作为第一个参数值。

一旦我们有了这个事件,就可以最后使用 switch 函数。首先,创建一个初始行为,是旋转速度设置为零的圆。然后,使用这个行为和前面声明的事件,创建最终的动画。图 16.3 显示最后运动中的动画,左边是 3 次单击的结果,右边是是 13 次单击的结果。

image

图 16.3 两个窗体显示运行中动画,鼠标单击几次后,速度不同

由于一等事件和行为的组合,就可以用完全声明的方式,写出很有趣的动画。现在,是时候来看一下 switch 函数的实现了,它使一切都成为可能。

分享到:
评论

相关推荐

    C++ Primer第四版【中文高清扫描版】.pdf

    6.6.1 使用switch 173 6.6.2 switch中的控制流 173 6.6.3 default标号 175 6.6.4 switch表达式与case标号 176 6.6.5 switch内部的变量定义 176 6.7 while语句 177 6.8 for循环语句 179 6.8.1 省略for语句头的某些...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    12.2.2 使用流函数对输出格式化 361 12.2.3 操作算子 364 12.2.4 保存设定的标记 365 12.2.5 其他的输出流成员函数 365 12.3 流的层次:继承的简要介绍 370 12.4 随机文件存取 375 第13章 递归 384 13.1 ...

    JavaScript详解(第2版)

     8.1.2 使用构造函数创建对象   8.1.3 对象的属性   8.1.4 对象的方法   8.2 类和用户自定义函数   8.2.1 什么是类   8.2.2 什么是this   8.2.3 内联函数作为对象的方法   8.3 对象字面量  ...

    PHP和MySQL WEB开发(第4版)

    3.6.2 使用asort()函数和ksort()函数对相关数组排序 3.6.3 反向排序 3.7 多维数组的排序 3.7.1 用户定义排序 3.7.2 反向用户排序 3.8 对数组进行重新排序 3.8.1 使用shuffle()函数 3.8.2 使用array_reverse()函数 ...

    PHP和MySQL Web开发第4版pdf以及源码

    3.6.2 使用asort()函数和ksort()函数对相关数组排序 3.6.3 反向排序 3.7 多维数组的排序 3.7.1 用户定义排序 3.7.2 反向用户排序 3.8 对数组进行重新排序 3.8.1 使用shuffle()函数 3.8.2 使用array_reverse()...

    PHP和MySQL Web开发第4版

    3.6.2 使用asort()函数和ksort()函数对相关数组排序 3.6.3 反向排序 3.7 多维数组的排序 3.7.1 用户定义排序 3.7.2 反向用户排序 3.8 对数组进行重新排序 3.8.1 使用shuffle()函数 3.8.2 使用array_reverse()...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     16.2.1 类型转换与模板类型参数 601  16.2.2 函数模板显式实参 603  16.2.3 尾置返回类型与类型转换 604  16.2.4 函数指针和实参推断 607  16.2.5 模板实参推断和引用 608  16.2.6 理解std::move 610  16.2....

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     16.2.1 类型转换与模板类型参数 601  16.2.2 函数模板显式实参 603  16.2.3 尾置返回类型与类型转换 604  16.2.4 函数指针和实参推断 607  16.2.5 模板实参推断和引用 608  16.2.6 理解std::move 610  16.2....

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    7.4.4 在构造函数中使用初始化列表 316 7.4.5 声明显式的构造函数 317 7.5 类的私有成员 318 7.5.1 访问私有类成员 320 7.5.2 类的友元函数 321 7.5.3 默认复制构造函数 323 7.6 this指针 325 7.7 类的const...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    5.3.2如何定义和使用构造函数 5.4静态变量和静态函数 5.4.1为什么需要静态变量 5.4.2静态变量的常见应用 5.4.3认识静态函数 5.4.4静态代码块 5.5小结 第6章封装 6.1使用封装 6.1.1为什么需要封装 6.1.2...

    Objective-C2.0程序设计

    16.2.1 常用的路径处理方法 16.2.2 复制文件和使用NSProcessInfo类 16.3 基本的文件操作:NSFileHandle 16.4 练习 第17章 内存管理 17.1 自动释放池 17.2 引用计数 17.2.1 引用计数和字符串 17.2.2 引用计数与实例...

    ActionScript开发技术大全

    24.4.1使用fscommand()函数 535 24.4.2fscommad()函数示例 537 24.5小结 539 第25章FlashPlayer的安全特性 540 25.1安全性概述 540 25.1.1权限管控模型 540 25.1.2安全沙箱模型 541 25.2系统管理员管控 543 25.2.1...

    轻松学C#(图解版)

    5.2.5 switch语句 77 5.3 循环语句 80 5.3.1 while语句 80 5.3.2 do-while语句 81 5.3.3 for语句 82 5.3.4 foreach语句 85 5.4 跳转语句 85 5.4.1 break语句 85 5.4.2 continue语句 86 5.4.3 goto语句 86 5.5 小结 ...

    Java开发技术大全 电子版

    13.3.4使用取整函数401 13.4Random类的使用402 13.5Date类和Calendar类的使用404 13.5.1Date类的简单使用404 13.5.2使用SimpleDateFormat格式化输出时间405 13.5.3Calendar类的特色408 13.5.4利用...

    疯狂JAVA讲义

    4.2.2 switch分支语句 76 4.3 循环结构 78 4.3.1 while循环语句 78 4.3.2 do while循环语句 79 4.3.3 for循环 80 4.3.4 嵌套循环 83 4.4 控制循环结构 84 4.4.1 使用break结束循环 84 4.4.2 使用continue...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    16.2.1 了解java.lang.enum类 533 16.3 关于注释 542 16.3.1 常用标准注释 542 16.3.2 自定义注释类型 545 16.3.3 执行时期读取注释信息 549 16.4 重点复习 551 16.5 课后练习 551 appendixa 如何...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    3.7.4 switch语句 90 3.8 跳转语句 92 3.8.1 break语句 92 3.8.2 continue语句 94 3.8.3 goto语句 95 3.9 C#预处理指令 97 3.9.1 排除和包含代码 98 3.9.2 定义预处理符号 98 3.9.3...

    Visual C# 2005程序设计自学手册 随书源码第一部分(共三部)

    3.1.5 使用Switch语句实现多分支选择 52 3.2 迭代语句 53 3.2.1 使用while循环语句控制程序 54 3.2.2 使用do while循环语句控制程序 55 3.2.3 使用for循环语句控制程序 56 3.2.4 使用foreach循环语句控制...

    ASP.NET3.5从入门到精通

    2.5.2 switch 选择语句的使用 2.6 使用循环语句 2.6.1 for 循环语句 2.6.2 while 循环语句 2.6.3 do while 循环语句 2.6.4 foreach 循环语句 2.7 异常处理语句 2.7.1 throw 异常语句 2.7.2 try-catch 异常语句 2.7.3...

Global site tag (gtag.js) - Google Analytics