碎言碎语

  • 和前面的 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 中在运行时才决定具体去调用哪个同名函数,而 Method overloading 在编译时已经确定了类型。

比方说 Java 多态的应用中,父类引用子类对象,在编译期间确定类型就会导致不符合期望的调用。

Coursera课程 Programming Languages, Part C 总结的更多相关文章

  1. Coursera课程 Programming Languages, Part A 总结

    Coursera CSE341: Programming Languages 感谢华盛顿大学 Dan Grossman 老师 以及 Coursera . 碎言碎语 这只是 Programming La ...

  2. Coursera课程 Programming Languages 总结

    课程 Programming Languages, Part A Programming Languages, Part B Programming Languages, Part C CSE341: ...

  3. Coursera课程 Programming Languages, Part B 总结

    Programming Languages, Part A Programming Languages, Part B Part A 笔记 碎言碎语 很多没有写过 Lisp 程序的人都会对 Lisp ...

  4. 【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 ...

  5. 【C语言】Coursera课程《计算机程式设计》台湾大学刘邦锋——Week6 String课堂笔记

    Coursera课程 <计算机程式设计>台湾大学 刘邦锋 Week6 String 6-1 Character and ASCII 字符变量的声明 char c; C语言使用一个位元组来储 ...

  6. ESSENTIALS OF PROGRAMMING LANGUAGES (THIRD EDITION) :编程语言的本质 —— (一)

    # Foreword> # 序 This book brings you face-to-face with the most fundamental idea in computer prog ...

  7. Coursera课程下载和存档计划[转载]

    上周三收到Coursera平台的群发邮件,大意是Coursera将在6月30号彻底关闭旧的课程平台,全面升级到新的课程平台上,一些旧的课程资源(课程视频.课程资料)将不再保存,如果你之前学习过相关的课 ...

  8. 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 ...

  9. The future of programming languages

    In this video from JAOO Aarhus 2008 Anders Hejlsberg takes a look at the future of programming langu ...

随机推荐

  1. time模块整理

    time模块中包含的方法 time() -- 返回当前系统的时间戳clock() -- 在UNIX系统上,它返回的是"进程时间",它是用秒表示的浮点数(时间戳). 而在WINDOW ...

  2. 「mysql优化专题」90%程序员没听过的存储过程和存储函数教学(7)

    一.MYSQL储存过程简介(技术文): 储存过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时 ...

  3. mysql版本升级

    环境 mysql安装在centos上,需要升级. mysql的版本是 mysql> select version(); +-----------+ | version() | +-------- ...

  4. 【python】字典dict

  5. jemeter——badboy导入的jmx文件自带元件解析

    线程组设置与解析 含义:1秒启动100个线程,每个线程循环调用20次请求  (包括FTP请求.Java请求.http请求,根据你提交的请求而定) delay thread creation until ...

  6. ABP PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词) 引发客户端错误 No 'Access-Control-Allow-Origin' header is present on the requested resource

    先请检查是否是跨域配置问题,请参考博客:http://www.cnblogs.com/donaldtdz/p/7882225.html 一.问题描述 ABP angular前端部署后,查询,新增都没问 ...

  7. 520. Detect Capital

      Given a word, you need to judge whether the usage of capitals in it is right or not. We define the ...

  8. Elasticsearch索引自动删除

    简介 脚本分2部分,1部分查找符合条件的索引名,2脚本调用1脚本,进行删除操作 脚本 查找符合条件的,默认大于30天 # coding:utf-8 __author__ = 'Jipu FANG' f ...

  9. 学会C sharp计算机编程语言 轻松开发财务、统计软件

    就像人们用同一种语言才可以顺畅交流一样,语言是计算机编程的根本,是IT世界交流的工具.运用这些计算机语言,人们可以创造出一个美妙的世界.你点击某个网页或是安装一个应用程序软件,这简简单单动作的背后,就 ...

  10. gitlab 远程 定时备份

    =============================================== 2017/11/1_第2次修改                       ccb_warlock 更新 ...