Day02 - Ruby比一比:Module模块与Class类别
前情提要
在第一天里,我很激昂地用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类别的更多相关文章
- 利用Module模块把构建的神经网络跑起来
训练一个神经网络往往只需要简单的几步: 准备训练数据 初始化模型的参数 模型向往计算与向后计算 更新模型参数 设置相关的checkpoint 如果上述的每个步骤都需要我们写Python的代码去一步步实 ...
- Ruby module ---模块,组件
module 的主要目的是把不同的方法和常量分别放进不同的命名空间. module 的命名方式跟类一样首字母大写,多个单词不用下划线. 如:CircleArea module 语法 module Mo ...
- ECMA Script 6_模块加载方案 ES6 Module 模块语法_import_export
1. 模块加载方案 commonJS 背景: 历史上,JavaScript 一直没有模块(module)体系, 无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来. 其他语言都有这项功能: ...
- Model模型和Module模块的区别
资料是从网上找的,具体是谁最先写的,不清楚了. Model通常是指模型.这个模型也许是你需求分析出来的, 也许是你算法做出来的. 不过最大可能是MVC的网站,或者是GUI开发模式中的M里的那个模型. ...
- AngularJs angular.Module模块接口配置
angular.Module Angular模块配置接口. 方法: provider(name,providerType); name:服务名称. providerType:创建一个服务的实例的构造函 ...
- 简单实例讲解linux的module模块编译步骤
注:原博文地址http://blog.sina.com.cn/s/blog_4ba5b45e0102v25h.html ---------------------------------------- ...
- AngularJS -- Module (模块)
点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 什么是AngularJS的模块 我们所说的模块,是你的AngularJS应用程序的一个组 ...
- JavaScript ES6 module 模块
在使用JavaScript开发大型项目时,模块开发概念是一个必须考虑的问题.其目的就是通过命名空间对各类业务对象进行一定的封装,防止命名冲突. 本篇着重介绍ES6 module中的export和imp ...
- es6(六):module模块(export,import)
es6之前,社区模块加载方案,主要是CommonJS(用于服务器)和AMD(用于浏览器) 而es6实现的模块解决方案完全可以替代CommonJS和AMD ES6模块设计思想:尽量静态化,在编译时就能确 ...
随机推荐
- Thread.Abort 方法
[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)] public void Abort() 在调用此方 ...
- MacOS:Django + Python3 + MySQL
Django Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站 ...
- 7.STM32中GPIO理解
端口概述 在STM32中,每个I/O端口可以由软件配置成为输入/输出模式.复位期间或刚复位后,I/O端口被配置成浮空输入模式.所有的GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时, 它们可以被激 ...
- 洛谷P1039 侦探推理(模拟)
侦探推理 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情 ...
- FBI树-数据结构(二叉树)
问题 B: [2004_p4]FBI树-数据结构 时间限制: 1 Sec 内存限制: 125 MB提交: 57 解决: 46 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称 ...
- redis中key的过期键删除策略
Redis过期键删除策略 Redis key过期的方式有三种: 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删 ...
- js对象的创建
一.通过对象直接量来创建 var emptyt={}; //相当于var empty=new Object; //如果属性名中包含空格.连字符(-).还有关键字,保留字时,要用字符串表示 var b ...
- Linux、Docker安装Nginx
Docker安装Nginx #docker images nginx #docker search nginx #docker pull nginx #docker run -it -p 8084:8 ...
- Go 1.11 Module 介绍
title: "Go 1.11 Module" date: 2018-10-26T23:50:56+08:00 draft: false --- Go 1.11 Module 介绍 ...
- Python中的取模运算
C++中的取模运算符%只能对整数使用(如果要对浮点数使用需要fmod),Python则不同,对整数或浮点数均有效. 在这里再介绍一下取模的定义:假设a,b两个数,那么a mod b = a - n*b ...