碎言碎语

  • 和前面的 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 总结相关推荐

  1. 华盛顿大学公开课Programming Languages by Dan Grossman 简介

    Programming Languages  by Dan Grossman 这门课依然是Coursera平台上的,是第二次开设.现在我已经习惯了Coursera,其他的平台感觉都没有这个好,特别是论 ...

  2. Programming Languages PartA Week2学习笔记——SML基本语法

    Programming Languages PartA Week2学习笔记--SML基本语法 首先简单介绍使用的SML语言,参考维基百科和百度百科: ML(Meta Language:元语言)是由爱丁 ...

  3. coursera课程下载_如何在永远消失之前下载Coursera的课程

    coursera课程下载 Coursera is shutting down their old platform on June 30th removing dozens (if not hundr ...

  4. Coursera课程Python for everyone:chapter9

    Chapter 9 Quiz 10 试题 1. How are Python dictionaries different from Python lists? Python lists mainta ...

  5. 如何免费注册Coursera课程

    One question I get asked all the time here at Class Central is: are Coursera courses really free? 在班 ...

  6. 【Python学习笔记】Coursera课程《Python Data Structures》 密歇根大学 Charles Severance——Week6 Tuple课堂笔记...

    Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week6 Tuple 10 Tuples 10.1 Tuples A ...

  7. CSE 110: Principles of Programming Languages

    CSE 110留学生作业代写.代做PatronList作业.代写Java编程语言作业.代做Java实验设计作业 CSE 110: Principles of Programming Languages ...

  8. coursera课程下载方法

    一.安装python环境 1.下载python(64位或32位,例如Windows X86-64 MSI Installer),双击安装: http://www.python.org/getit/re ...

  9. 批量下载coursera课程

    系统环境为: Win7 x64 原文出处: Coursera课程批量下载(保持资源原目录结构) 一.安装python环境 1.下载python(64位或32位,例如Windows X86-64 MSI ...

最新文章

  1. 实战:基于OpenCV的人眼检测
  2. python画笑脸-如何用Python画滑稽笑脸
  3. 建立项目的webpack简单配置
  4. Redis源码简要分析
  5. 基于mini2440的看门狗(裸机)
  6. 面试题目_经典面试题目「回溯算法」解数独
  7. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider...
  8. 广州 adobe 技术者开发日回归
  9. linux 生成hash值命令,linux-从给定哈希计算base64编码哈希?
  10. 数据结构-树3-红黑树
  11. PHP第十次实验总结,The Clean Architecture in PHP 读书笔记(十)
  12. Windows绘图中的GDI映射模式
  13. ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)
  14. CactiEZ中文版说明
  15. 极限分辨率是艾里斑的直径还是半径_小孔成像(二)——衍射,数值孔径和分辨率...
  16. 日期时间公式计算机,‎App Store 上的“多少天-重要日期时间计算器”
  17. wps空白页怎么删除,迅速帮你解决问题
  18. matlab求图像峰度与斜度,python中的图像偏斜和峰度
  19. 德生收音机创始人梁伟(华工杰出校友)的无线电之梦
  20. 瞬态二极管,有哪些?

热门文章

  1. ipv4链路不通或服务器无响应,ping不通或丢包时如何进行链路测试?
  2. 学习笔记2-Linux2
  3. 一学就废的并查集它来了
  4. Redis:13--常用功能之redis-cli redis-server等命令
  5. STL源码剖析 第八章 配接器
  6. C++读取文件,将文件内容读到string字符串里面
  7. Android设计模式之——抽象工厂模式
  8. 程序员的创业困境 谁来帮助出出主意?
  9. Eclipse GCC 入门
  10. 使用ffmpeg进行h.264编码