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 A
def q0
3
end
def q1
q0 + 12
end
end
a = A.new
puts a.q1
class A
def q0
"as"
end
end
puts a.q1
此时就会报错:TypeError: no implicit conversion of Fixnum into String。
然后我们可以有一个操作:
class Fixnum
def +
1
end
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 A
def even x
if x == 0
true
else
puts "odd"
odd(x - 1)
end
end
def odd x
if x == 0
false
else
puts "even"
even(x - 1)
end
end
end
class B < A
def even x
x % 2 == 0
end
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 多态的应用中,父类引用子类对象,在编译期间确定类型就会导致不符合期望的调用。
Coursera课程 Programming Languages, Part C 总结的更多相关文章
- Coursera课程 Programming Languages, Part A 总结
Coursera CSE341: Programming Languages 感谢华盛顿大学 Dan Grossman 老师 以及 Coursera . 碎言碎语 这只是 Programming La ...
- Coursera课程 Programming Languages 总结
课程 Programming Languages, Part A Programming Languages, Part B Programming Languages, Part C CSE341: ...
- Coursera课程 Programming Languages, Part B 总结
Programming Languages, Part A Programming Languages, Part B Part A 笔记 碎言碎语 很多没有写过 Lisp 程序的人都会对 Lisp ...
- 【Python学习笔记】Coursera课程《Using Python to Access Web Data》 密歇根大学 Charles Severance——Week6 JSON and the REST Architecture课堂笔记
Coursera课程<Using Python to Access Web Data> 密歇根大学 Week6 JSON and the REST Architecture 13.5 Ja ...
- 【C语言】Coursera课程《计算机程式设计》台湾大学刘邦锋——Week6 String课堂笔记
Coursera课程 <计算机程式设计>台湾大学 刘邦锋 Week6 String 6-1 Character and ASCII 字符变量的声明 char c; C语言使用一个位元组来储 ...
- ESSENTIALS OF PROGRAMMING LANGUAGES (THIRD EDITION) :编程语言的本质 —— (一)
# Foreword> # 序 This book brings you face-to-face with the most fundamental idea in computer prog ...
- Coursera课程下载和存档计划[转载]
上周三收到Coursera平台的群发邮件,大意是Coursera将在6月30号彻底关闭旧的课程平台,全面升级到新的课程平台上,一些旧的课程资源(课程视频.课程资料)将不再保存,如果你之前学习过相关的课 ...
- Natural language style method declaration and usages in programming languages
More descriptive way to declare and use a method in programming languages At present, in most progra ...
- The future of programming languages
In this video from JAOO Aarhus 2008 Anders Hejlsberg takes a look at the future of programming langu ...
随机推荐
- ssm学习(五)--加入分页插件
之前我们的查询列表是将所有的数据查询出来,并没有做分页,当数据很少的时候,是不需要分页,但是如果数据很多的时候,所有数据显示在一个页面显然是不合适的. 之前用hibernate的时候,可以直接通过查询 ...
- 中文颜色名称与RGB颜色对照表
中文颜色名称颜色对照表 鸨色 #f7acbc 赤白橡 #deab8a 油色 #817936 绀桔梗 #444693 踯躅色 #ef5b9c 肌色 #fedcbd 伽罗色 #7f7522 花色 #2b4 ...
- 【ANT】时间戳
属性 说明 举例 DSTAMP 设置为当前日期,默认格式:yyyymmdd 20170309 TSTAMP 设置为当前时间,默认格式:hhmm 2007 TODAY 设置为当前日期,带完整的月份 Ma ...
- vue vuex vue-rouert后台项目——权限路由(超详细简单版)
项目地址:vue-simple-template共三个角色:adan barbara carrie 密码全是:123456 adan 拥有 最高权限A 他可以看到 red , yellow 和 blu ...
- iOSXML & JSON 简介
XML & JSON 简介 •JSON –作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 –基于JavaScript的一个子集 –易读性略差,编码手写难度大,数据量小 ...
- java二维码生成代码
QRCodeUtil.encode(text, "D:/004.jpg", "D:", true, "exp");// 这个方法的第一个参数 ...
- Python连接webstocker获取消息
简介(脚本都是根据网上资料改写) 此脚本主要是客户觉得webstcket不稳定,所以编辑一个脚本,不停的请求web服务器,当发生错误时,脚本自动退出(). 脚本内容 脚本一 # -*- coding: ...
- Design Patterns笔记
一些笔记. strategy : facilitates the switch of the different but related algorithms/behaviors observer p ...
- python3.5 + PyQt5 +Eric6 实现的一个计算器
目前可以实现简单的计算.计算前请重置,设计的时候默认数字是0,学了半天就做出来个这么个结果,bug不少. python3.5 + PyQt5 +Eric6 在windows7 32位系统可以完美运行 ...
- Oracle添加记录的时候报错:违反完整性约束,未找到父项关键字
今天需要向一个没有接触过的一个Oracle数据库中添加一条记录,执行报错: 分析: 报错的根本原因:未找到父项关键字的原因是因为你在保存对象的时候缺失关联对象. 问题的解决思路:先保存关联对象后再保存 ...