博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Coursera课程 Programming Languages, Part C 总结
阅读量:6723 次
发布时间:2019-06-25

本文共 2088 字,大约阅读时间需要 6 分钟。

碎言碎语

  • 和前面的 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  endenda = A.newputs a.q1class A  def q0    "as"  endendputs a.q1

此时就会报错:TypeError: no implicit conversion of Fixnum into String

然后我们可以有一个操作:

class Fixnum  def +      1  endend

将上面的代码复制到 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 # Proclambda do end.class # Proc

这里 lambda {} 是一个整体,{ ... }可以替换成do ... end

lambda 在函数编程语言中很熟悉了,在 Ruby 中我们也几乎可以那么用。

通过调用 call 方法去执行这个“函数”。

q = lambda { |x| x * x }q.call 3 # 9

更详细的话这个帖子讲的不错:。

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  endendclass B < A  def even x    x % 2 == 0  endend

B 是 A 的子类,B 中重写了 even 方法,也可以是使用 odd 方法,但是在调用 odd 方法的时候,odd 方法中使用的实际是 B 类中重写的 even 方法。

b = B.newb.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 多态的应用中,父类引用子类对象,在编译期间确定类型就会导致不符合期望的调用。

转载于:https://www.cnblogs.com/ftae/p/8305635.html

你可能感兴趣的文章
Pitch,Yaw,Roll的概念
查看>>
Texture tiling and swizzling
查看>>
IOS 真机调试 报错 图片资源 不存在 原因
查看>>
部署NTP服务器进行时间同步
查看>>
Codeforces Round 97B 点分治
查看>>
Candy
查看>>
dN/dS与分子进化常用软件
查看>>
在 foreach 里使用引用要注意的陷阱(转)
查看>>
python3和paramiko安装
查看>>
HDU 2586 How far away ? 离线lca模板题
查看>>
CMarkup 解析XML
查看>>
vue中computed和watch的用法
查看>>
关于Jquery动画滞后问题(转)
查看>>
函数调用约定和堆栈
查看>>
shell编程之运算符
查看>>
[Linux] cscope使用个人笔记
查看>>
JAVA中局部变量 和 成员变量有哪些区别
查看>>
Windows.UI.Cred.dll损坏导致不能设置 PIN 密码
查看>>
数组未退化为指针的三种例外
查看>>
了解External Accessory Framework之EAAccessory
查看>>