Coursera课程 Programming Languages, Part C 总结
碎言碎语
- 和前面的 ML 和 Racket 感觉明显不一样了,一边学着一边觉得这真是一门奇怪的语言,有着各种奇怪的语法,不过真的算是一个奇妙的体验(相比前面的两门语言,Ruby 的学习资源多了不少)。
- week 1 的作业直接就是给出一份 Ruby 源码的俄罗斯方块游戏,而任务就是给这个游戏添加功能,趣味性不用多说,也能很好的考察到阅读代码、应用已有代码的能力。不得不再次感叹作业真的用心。
- week 2 首先就是比较,OOP vs FP,大量的代码示例以及详细的讲解,但绝不是为了告诉我们用什么而不用什么,而是在什么时候该用什么,使用的优缺点。而作业则涉及了 SML 和 Ruby 两门语言,我们尝试去用这两门编程语言去完成同一件事情。
笔记
1. Ruby is a pure object-oriented language, which means all values in the language are objects.
2. 动态的类定义
即使我们得到了一个类实例化后的对象,在后面我们去修改这个类的方法(只需要重写这个类中的那个我们需要修改的方法),之前的对象的方法也会改变,那么就会有一个问题。
class Adef q03enddef q1q0 + 12end
enda = A.newputs a.q1class Adef q0"as"end
endputs a.q1
此时就会报错:TypeError: no implicit conversion of Fixnum into String
。
然后我们可以有一个操作:
class Fixnumdef +1end
end
将上面的代码复制到 1.rb 文件并保存。
在 REPL 中输入 load "1.rb"
。
REPL直接崩溃了,报错:in '+': wrong number of arguments (1 for 0) (ArgumentError)
。
3. Ruby 中的 Blocks 和 Proc Class
在 Ruby 中 Blocks 很类似于函数式编程语言中的闭包(closures),或者说功能上很类似匿名函数,可以传递给一个函数,在函数内部执行,或者结合数组自带的那些方法使用(类似于函数式编程语言中的高阶函数)。
比如可以这样:
10.times { puts "HI" }
10 是一个 Fixnum 类实例化后的对象,它自带 times 方法,功能么就是执行后面的 Blocks 里面的代码 10 次。
但是 Blocks 并不是对象,当然你也不能辨别它属于哪个类,所以它无法赋值给一个变量,或者放到一个数组里,或者作为参数传递给一个函数。这个时候就需要 Proc 类。
它实例化后的对象就是lambda {}
。
lambda {}.class # Proc
lambda do end.class # Proc
这里 lambda {}
是一个整体,{ ... }
可以替换成do ... end
。
lambda 在函数编程语言中很熟悉了,在 Ruby 中我们也几乎可以那么用。
通过调用 call 方法去执行这个“函数”。
q = lambda { |x| x * x }
q.call 3 # 9
更详细的话这个帖子讲的不错:聊聊 Ruby 中的 block, proc 和 lambda。
4. Dynamic Dispatch
class Adef even xif x == 0trueelseputs "odd"odd(x - 1)endenddef odd xif x == 0falseelseputs "even"even(x - 1)endend
endclass B < Adef even xx % 2 == 0end
end
B 是 A 的子类,B 中重写了 even 方法,也可以是使用 odd 方法,但是在调用 odd 方法的时候,odd 方法中使用的实际是 B 类中重写的 even 方法。
b = B.new
b.odd 9
只会打印一个 even 字符串。
实际上 A 类中在调用方法的时候省略了 self ,实际上应该是 self.odd(x - 1)
self.even(x - 1)
。
那么实际去调用哪个方法,取决于 self 是什么,这里使用 B 的实例 b 去调用这个方法,self 就是 b 这个实例。
5. Multimethods
- Multiple dispatch
- What is the difference between multiple dispatch and method overloading?
- Overloading in Java and multiple dispatch
Multiple dispatch 中在运行时才决定具体去调用哪个同名函数,而 Method overloading 在编译时已经确定了类型。
比方说 Java 多态的应用中,父类引用子类对象,在编译期间确定类型就会导致不符合期望的调用。
转载于:https://www.cnblogs.com/ftae/p/8305635.html
Coursera课程 Programming Languages, Part C 总结相关推荐
- 华盛顿大学公开课Programming Languages by Dan Grossman 简介
Programming Languages by Dan Grossman 这门课依然是Coursera平台上的,是第二次开设.现在我已经习惯了Coursera,其他的平台感觉都没有这个好,特别是论 ...
- Programming Languages PartA Week2学习笔记——SML基本语法
Programming Languages PartA Week2学习笔记--SML基本语法 首先简单介绍使用的SML语言,参考维基百科和百度百科: ML(Meta Language:元语言)是由爱丁 ...
- coursera课程下载_如何在永远消失之前下载Coursera的课程
coursera课程下载 Coursera is shutting down their old platform on June 30th removing dozens (if not hundr ...
- Coursera课程Python for everyone:chapter9
Chapter 9 Quiz 10 试题 1. How are Python dictionaries different from Python lists? Python lists mainta ...
- 如何免费注册Coursera课程
One question I get asked all the time here at Class Central is: are Coursera courses really free? 在班 ...
- 【Python学习笔记】Coursera课程《Python Data Structures》 密歇根大学 Charles Severance——Week6 Tuple课堂笔记...
Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week6 Tuple 10 Tuples 10.1 Tuples A ...
- CSE 110: Principles of Programming Languages
CSE 110留学生作业代写.代做PatronList作业.代写Java编程语言作业.代做Java实验设计作业 CSE 110: Principles of Programming Languages ...
- coursera课程下载方法
一.安装python环境 1.下载python(64位或32位,例如Windows X86-64 MSI Installer),双击安装: http://www.python.org/getit/re ...
- 批量下载coursera课程
系统环境为: Win7 x64 原文出处: Coursera课程批量下载(保持资源原目录结构) 一.安装python环境 1.下载python(64位或32位,例如Windows X86-64 MSI ...
最新文章
- 实战:基于OpenCV的人眼检测
- python画笑脸-如何用Python画滑稽笑脸
- 建立项目的webpack简单配置
- Redis源码简要分析
- 基于mini2440的看门狗(裸机)
- 面试题目_经典面试题目「回溯算法」解数独
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider...
- 广州 adobe 技术者开发日回归
- linux 生成hash值命令,linux-从给定哈希计算base64编码哈希?
- 数据结构-树3-红黑树
- PHP第十次实验总结,The Clean Architecture in PHP 读书笔记(十)
- Windows绘图中的GDI映射模式
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)
- CactiEZ中文版说明
- 极限分辨率是艾里斑的直径还是半径_小孔成像(二)——衍射,数值孔径和分辨率...
- 日期时间公式计算机,App Store 上的“多少天-重要日期时间计算器”
- wps空白页怎么删除,迅速帮你解决问题
- matlab求图像峰度与斜度,python中的图像偏斜和峰度
- 德生收音机创始人梁伟(华工杰出校友)的无线电之梦
- 瞬态二极管,有哪些?