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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何判断网络是否进入拥塞状态

通过观察网络的吞吐量与网络负载间的关系 如果随着网络负载的增加&#xff0c;网络的吞吐量明显小于正常的吞吐量&#xff0c;那么网络就进入例如轻度拥塞的状况。 如果网络得吞吐量随着网络负载的增大反而下降&#xff0c;那么网络就可能进入拥塞状态。 如果网络的负载继续…

如何拷贝工程_如何将premiere的工程及素材文件打包?

我们在剪辑视频的时候经常会遇到素材丢失的情况&#xff0c;或者说需要换地方或换电脑继续剪辑。特别是以前做的视频现在需要修改一些地方&#xff0c;然后打开工程文件会发现素材丢失&#xff0c;如图&#xff1a;这种情况要不就是素材已经删除&#xff0c;要不就是素材改变了…

迈出从3K到1W的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问&#xff1a; 为什么一个相似的功能&#xff0c;大牛一会儿就搞定&#xff0c;然后悠闲地品着下午茶逛淘宝&#xff1b;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后&#xff0c;大牛只需潇洒地敲敲键盘&#xff0c;改改配置&#…

使用pip安装virtualenv时出现问题

使用pip出现问题 fxd0ubuntu:~$ sudo pip install virtualenv [sudo] password for fxd0: env: ‘pip’: No such file or directory fxd0ubuntu:~$ pip insatall virtualenv Command pip not found, but can be installed with: sudo apt install python-pip 安装pip fxd0…

jquery 获取 outerHtml 包含当前节点本身的代码

在开发过程中&#xff0c;jQuery.html() 是获取当前节点下的html代码&#xff0c;并不包含当前节点本身的代码&#xff0c;然后我们有时候确需要&#xff0c;找遍jQuery api文档也没有任何方法可以拿到。 看到有的人通过parent().html()&#xff0c;如果当前元素没有兄弟元素还…

拥塞控制中的开环和闭环控制

拥塞控制是很难设计的&#xff0c;因为它是一个动态的问题&#xff0c;许多情况下&#xff0c;甚至正式拥塞控制机制本身成为引起网络性能恶化甚至死锁的原因。从控制理论的角度来看拥塞控制这个问题&#xff0c;可以分为开环控制和闭环控制两种方法。开环控制就是在设计网络时…

c语言编写一个菜单系统_一招教你,轻松解决C语言编写一个正整数的所有因子!...

这个实例是一个能提高分析能力的实例&#xff0c;这个实例主要用到for语句&#xff0c;关键是如何确定其中变量的范围。求一个正整数的所有因子先来看看编程结果演示&#xff1a;编程演示输出结果编程如下:#include/*引用预处理命令&#xff0c;预处理包含stdio.h的头文件*/mai…

【简明笔记】循环条件的优化

[javascript] view plaincopy/* * 优化循环 */ //优化前 for(var i0; i < items.length; i){ //判断条件&#xff1a;(1)i<items.length; (2)i<items.length true; process(items[i]); } //优化后 var count items.length; //把length属性放在局…

ubuntu18.04安装mysql数据库

mysql安装参考&#xff1a; https://www.cnblogs.com/opsprobe/p/9126864.html 文中写的很详细&#xff0c;但是未进行初始密码的修改&#xff0c;初始密码修改参考文章&#xff1a; https://blog.csdn.net/qq_38737992/article/details/81090373

第四次Scrum编码冲刺!!!!

第四次Scrum编码冲刺&#xff01;&#xff01;&#xff01;&#xff01; 一、总体任务&#xff1a; 本次冲刺是完成对图书馆管理系统的最后三个功能的实现------管理员对用户授权、用户注销和用户查询 二、个人任务及完成情况&#xff1a; 本人本次的任务是实现对删除用户功能以…

Spring Cloud Edgware新特性之八:Zuul回退的改进

为什么80%的码农都做不了架构师&#xff1f;>>> Spring Cloud Edgware对Hystrix回退的逻辑进行了一些改进。本文将信息探讨新旧版本的回退操作&#xff0c;并分析的原因及改进后的优势。 Dalston及更低版本 对于Dalston及更低版本&#xff0c;要想为Zuul提供回退&a…

因特网 以太网 互联网的含义及区别

互联网是Internet的意译&#xff0c;因特网是Internet的音译&#xff0c;两者是等同的&#xff0c;是一个全世界范围的广域网。目前应用最为广泛的一类局域网是总线局域网-以太网。以太网的核心技术是它的随机争用型介质访问控制方法&#xff0c;即带有冲突检测的载波侦听多路访…

idea插件导出_Intellij IDEA 中我一直在用的几个插件

提前声明一下&#xff0c;今天这篇文章是在我家的那台 Mac 机子上写的&#xff0c;但是文中使用的快捷键还是主要针对于 Windows 平台「由于我的大多数读者在使用该系统&#xff0c;我是有多么爱你们&#xff5e;&#xff5e;&#xff5e;」。接上一篇《谈谈我与 Intellij IDEA…

打开.md格式文件的方式

我们平常偶尔会收到后缀为*.md的文件&#xff0c; md是简称&#xff0c;它的全名为MARKDOWN。MARKDOWN是一种标记语言软件&#xff0c;下载安装MarkdownPad2即可打开。 具体安装参考文章&#xff1a;MarkdownPad2安装汉化与注册码 https://blog.csdn.net/weixin_40612082/art…

吃透理财三句话人人都能成百万富翁

财专家告诉我们&#xff1a;理财的最佳方式并非追求高超的金融投资技巧&#xff0c;只要你掌握正确的理财观念&#xff0c;并且持之以恒&#xff0c;若干年之后——人人都能成为百万富翁。我每月到企业举办一小时的免费“理财讲座”&#xff0c;一直都很受员工们的欢迎。讲座内…

Apache - Storm

一、Apache Storm Storm是一个分布式的&#xff0c;可靠的&#xff0c;容错的数据流处理系统。Storm集群的输入流由一个被称作spout的组件管理&#xff0c;spout把数据传递给bolt&#xff0c;bolt要么把数据保存到某种存储器&#xff0c;要么把数据传递给其它的bolt。一个Stor…

Python基础学习五 内置模块

time 模块 1 >>> import time2 >>> time.time()3 1491064723.8086694 >>> # time.time()返回当前时间的时间戳timestamp(定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数)的方法,无参数5 >>> time.asctime()6 Sun Apr 2…

如何在windows上将本地项目上传到Github

详细步骤参考&#xff1a; https://www.cnblogs.com/smfx1314/p/8426115.html 感谢作者分享&#xff01;

Sublime Text3使用Package Control 报错There Are No Packages Available For Installation

在使用sublime时&#xff0c;有时候我们希望将代码复制出来后仍然是高亮显示&#xff0c;这样我们便需要安装SublimeHighLight插件&#xff0c;在安装SublimeHighLight插件之前&#xff0c;我们应该先安装Package Control插件&#xff01; 1、Package Control插件作用&#xff…