前情提要

在第一天里,我很激昂地用Ruby的类别、物件、方法,写了宣言!

class TingIsIronman

def initialize

@message =“I'm going to write 30 IT articles in 30 days!”

end

def method

puts @message.gsub(“write”,“create”)

end

end

object = TingIsIronman.new

object.method

#=> I'm going to create 30 IT articles in 30 days!

然后我从探索类别的栗子?:查询class的父类别时,发现一个铁铮铮的事实:tw.class.superclass.class.superclass印出来的结果是moudle。tw.class.superclass.class.superclass.superclass印出来的结果是Object。

(白话翻译吐司:

「番薯岛」的类别是「国家」,「国家的」父类别是「世界」;

「世界」的类别,依旧是个「类别」;「类别」的「父类别」,是个「模块」喔喔喔喔!!!)

所以在第二天的文章里,我们就来聊一聊模块(Module)吧!:)

Ruby经典面试题目#02

类别与模块有什么不同?What's the Difference Between a Class and a Module?

从以上「番薯岛」的例子里,我们从「类别」的「父类别」,是个「模块」这句话找到灵感,已经可以做出比较表格的第一列:

超级比一比类别Class模块Module

父类别superclass模块Module物件Object

从龙哥的Ruby教学里关于海贼王鲁夫的例子,我得到一个重要的观念:

类别可以继承,而模块不行。

我们在第一篇文章里已经透过番薯岛的例子利用类别过继承(vmwork),

现在来让我们继续练习继承的概念,new更多「国家」物件,用Ruby语言,领略世界各国之美:

class World

def beautiful(scenery)

p“#{scenery} is so beautiful!!“

end

end

class Country < World

end

tw = Country.new

au = Country.new

jp = Country.new

tw.beautiful“Taroko Gorge”

jp.beautiful“Fujisan”

au.beautiful“Great Barrier Reef”

程序结果如我们所料:

Taroko Gorge is so beautiful!!

Fujisan is so beautiful!!

Great Barrier Reef is so beautiful!!

愿我们都能透过以上继承的代码,看见世界上的每个国家,各自的美好:)

说完类别了,来聊模块吧!

模块就是像是图书馆(library)。

你到了图书馆借了某本程序书籍,把书本里的「知识」(在程序语言里,我们叫它做方法method),吸收、消化,然后,放入(include)到脑袋。

在父母生下我的年代里,Ruby还没有被创造出来(告诉我有哪一个小baby一生下来就会Coding的嘛?没有嘛!),

因此,无论是学习Ruby、或是任何程序语言的知识,需要我们后天透过「网际网络」这个世界上最大的图书馆去学习。

所以,我们可以把模块(module)理解为后天的知识,无法被继承(inheritance),而是后天习得的。

只要有心,就能学得会:)

来动手写一个模块,描述上述的情境:

module Library

#网络就像是个大型图书馆模块(名称要以常数、大字英文字母开头,跟书名一样)

def IThelp #定义IT邦方法

p“I'm learning from others' IT articles on IThelp Website!”

end

end

class EveryoneLearnsRuby

def initialize(name)

@name = name

end

include Library

#让每个人学Ruby时都可以使用Library模块

end

Ting = EveryoneLearnsRuby.new(“Ting”)

# new一个新人物Ting(OS:大家好我是Ruby新手村民,请多指教!XD)

Ting.IThelp

#=> I'm learning from others' IT articles on IThelp Website!

如果屏幕前面的你也想要学Ruby的话,当然也可以像我一样,使用图书馆模块里的IT邦方法喔!:)

You = EveryoneLearnsRuby.new(“You”)

You.IThlep

#=> I'm learning from others' IT articles on IThelp Website!

「超级比一比」表格再扩充:

超级比一比类别Class模块Module

父类别superclass模块Module物件Object

继承inheritance可继承不可继承

包含inclusion不可被包含可被包含

接下来我们要继续更多探索不同之处。拿The Difference Between a Class and a Module?去请教Google大神,

你会发现出现的第一段文字回答是:

The Difference Between a Class and a Module.Basically,a class can be instantiated but a module cannot.A module will never be anything other than a library of methods.A class can be so much more -- it can hold its state(by keeping track of instance variables)and be duplicated as many times as you want.出处

这里说明一个很重要的概念instantiation。实体变数(Instance Variables)是在类别class使用时才会被建立,如同我们刚在例子中所举的:

class EveryoneLearnsRuby

def initialize(name)

@name = name

end

include Library

#让每个人学Ruby时都可以使用Library模块

end

其中的@name就是实体变数。

超级比一比类别Class模块Module(xcsjbj)

父类别superclass模块Module物件Object

继承inheritance可继承不可继承

包含inclusion不可被包含可被包含

延伸extension不可延伸可被延伸

实体化instantiation可被实体化(instantiated)不可被实体化

今天先写到这里,预计明天文章会提到extension。

做这个表格时,我发现:跟别人比较,比得好累好辛苦~

还是跟昨天的自己比就好。

只要每天都有进步,都好!:)

Day02 - Ruby比一比:Module模块与Class类别的更多相关文章

  1. 利用Module模块把构建的神经网络跑起来

    训练一个神经网络往往只需要简单的几步: 准备训练数据 初始化模型的参数 模型向往计算与向后计算 更新模型参数 设置相关的checkpoint 如果上述的每个步骤都需要我们写Python的代码去一步步实 ...

  2. Ruby module ---模块,组件

    module 的主要目的是把不同的方法和常量分别放进不同的命名空间. module 的命名方式跟类一样首字母大写,多个单词不用下划线. 如:CircleArea module 语法 module Mo ...

  3. ECMA Script 6_模块加载方案 ES6 Module 模块语法_import_export

    1. 模块加载方案 commonJS 背景: 历史上,JavaScript 一直没有模块(module)体系, 无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来. 其他语言都有这项功能: ...

  4. Model模型和Module模块的区别

    资料是从网上找的,具体是谁最先写的,不清楚了. Model通常是指模型.这个模型也许是你需求分析出来的, 也许是你算法做出来的. 不过最大可能是MVC的网站,或者是GUI开发模式中的M里的那个模型. ...

  5. AngularJs angular.Module模块接口配置

    angular.Module Angular模块配置接口. 方法: provider(name,providerType); name:服务名称. providerType:创建一个服务的实例的构造函 ...

  6. 简单实例讲解linux的module模块编译步骤

    注:原博文地址http://blog.sina.com.cn/s/blog_4ba5b45e0102v25h.html ---------------------------------------- ...

  7. AngularJS -- Module (模块)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 什么是AngularJS的模块 我们所说的模块,是你的AngularJS应用程序的一个组 ...

  8. JavaScript ES6 module 模块

    在使用JavaScript开发大型项目时,模块开发概念是一个必须考虑的问题.其目的就是通过命名空间对各类业务对象进行一定的封装,防止命名冲突. 本篇着重介绍ES6 module中的export和imp ...

  9. es6(六):module模块(export,import)

    es6之前,社区模块加载方案,主要是CommonJS(用于服务器)和AMD(用于浏览器) 而es6实现的模块解决方案完全可以替代CommonJS和AMD ES6模块设计思想:尽量静态化,在编译时就能确 ...

随机推荐

  1. NanoPC-T4/RK3399开发板Ubuntu FriendlyCore系统开机自动运行客户程序

    RK3399开机自动运行客户程序 比如hellohello.c 交叉编译:aarch64-linux-gcc hello.c -o hello使用SecureCRT软件通过串口下载到开发板rz修改文件 ...

  2. C# .net mvc web api 返回 json 内容,过滤值为null的属性

    在WebApiConfig.Register 中增加一段 #region 过滤值为null的属性 //json 序列化设置 GlobalConfiguration.Configuration.Form ...

  3. 工控随笔_16_西门子_S7-200.Smart软件安装兼容性说明和错误代码:error code hr=0x80070430

    现在西门子的软件是更新换代太快了,前几年还是Step 7 Micro/Win,后来又出了S7-200 Smart PLC,理所当然的编程调试软件也水涨船高,出了新的Step 7  Micro/Win ...

  4. TCP/IP各层对应的协议

    应用层: 该层包括所有和应用程序协同工作,利用基础网络交换应用程序专用的数据协议.如: HTTP:超文本传输协议. TELNET:(网络电传),通过一个终端(terminal)登录到网络(运行在TCP ...

  5. MTSC2018 | 确认过眼神,在这里能遇见Google、阿里、百度......

    MTSC2018部分Topic曝光啦 Google,阿里,百度,美团,小米,360,网易等公司是如何将技术转化为现实生产力,提高工作效率的?离开Saucelab的Jonathan又是如何规划Appiu ...

  6. Functional programming idiom

    A functional programming function is like a mathematical function, which produces an output that typ ...

  7. 二叉树遍历(flist)(二叉树,已知中序层序,求先序)

    问题 C: 二叉树遍历(flist) 时间限制: 1 Sec  内存限制: 128 MB提交: 76  解决: 53[提交][状态][讨论版][命题人:quanxing][Edit] [TestDat ...

  8. 三、thymeleaf模板引擎构建前台html, 后台使用 ModelAndView 和 Model 模型

    项目源码:https://github.com/y369q369/springBoot.git      ->     thymeleaf 私聊QQ: 1486866853 1.pom.xml中 ...

  9. Git 分布式版本管理器 windows环境下使用

    首先需要下载Git来安装  没有安装文件的小伙伴可以网盘下载——>   https://pan.baidu.com/s/1owwUItDri9skqYzOjzXLsw 之后安装Git  一路很顺 ...

  10. 刘志梅201771010115.《面向对象程序设计(java)》第十六周学习总结

    实验十六  线程技术 实验时间 2017-12-8 1.实验目的与要求 (1)当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或者出现了在方法中没有捕获的异常时,线程将 ...