ruby学习笔记(5)-模块module的运用

ruby中的module与.net中的namespace有点类似,可以用来区分同名但属于不同开发者(或组织)的代码。

下面的代码,定义了一个Me模块,里面的sqrt与Math模块中的sqrt重名,另外还有一个重名常量PI

#定义一个模块(有点类似.net中的命名空间)
module Me
	def sqrt(num1,num2=-1)
		return "num1=#{num1},num2=#{num2}"
	end

	PI = 3.14;
end

puts Math::PI #在未include任何模块之前,只能通过完整引用来引用常量
puts Math.sqrt(2) #引用方法用点,引用常量用双冒号

puts "*" * 50 #打印50个*做为分隔线

include Math #包含一个模块(可以理解为c#中的引用命名空间)
puts  sqrt(2) #这里调用的是Math中的sqrt方法

puts "*" * 50
puts Me::PI

include Me
puts  sqrt(2) #这里调用的是Me中的sqrt方法
puts  sqrt(1,2) #同上
puts  PI

puts "*" * 50

puts Math::sqrt(2) #通过完整引用来调用Math中的sqrt方法
puts Math.sqrt(2) #效果与上面相同

puts "*" * 50

运行结果:

3.14159265358979
1.4142135623731
**************************************************
1.4142135623731
**************************************************
3.14
num1=2,num2=-1
num1=1,num2=2
3.14
**************************************************
1.4142135623731
1.4142135623731
**************************************************

另外模块还能用来实现类似"接口"的效果,比如有这么一个场景:

一个动物游戏中,有N种鸭子,所有的鸭子都会游泳,但野鸭还能飞,按照传统OO的做法,我们会定义一个Duck基类,然后所有鸭子都继承自它,然后再弄一个IFly接口,让“野鸭”类实现该接口即可。

ruby中可以这么干:

#鸭子类
class Duck
	def swim
		print self.class , " can swim...\n";
		end
	end

#"会飞的"模块
module FlyModule
	def fly
		print " and I can fly...\n"
	end
end

#野鸭(会飞,会游)
class Mallard < Duck
	include FlyModule #导入模块后,该类即具有模块中定义的方法(可以理解为实现了接口)
end

#黑鸭(只会游戏)
class Coot < Duck
	def Color
		"Black"
	end
end

aCoot = Coot.new
aCoot.swim;

aMallard = Mallard.new
aMallard.swim;
aMallard.fly;

运行结果:
Coot can swim...
Mallard can swim...
 and I can fly...

最后module还能玩一些静态语言认为BT的东东,比如:刚才这款游戏中,系统随机从天上掉下一个宝贝,一群黑鸭子中谁捡到后谁就能飞起来!这也难不倒ruby:

aCoot1 = Coot.new
aCoot2 = Coot.new
aCoot2.extend(FlyModule)

aCoot1.swim
aCoot2.swim
aCoot2.fly
#aCoot1.fly #因为aCoot1没有扩展FlyModule,所以它不能飞,调用将报错

这里实例aCoot2通过extend关键字,扩展了FlyModule模块,所以这个实例也就能调用FlyModule中的方法!

时间: 2024-09-22 20:02:57

ruby学习笔记(5)-模块module的运用的相关文章

ruby学习笔记(11)--symbol与hash参数

symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001".object_id puts "0001".object_id puts "0001".object_id puts "0001".object_id 输出结果类似如下: 32088750320887303208871032088690 可以

Ruby学习笔记_索引贴

学习Ruby也有段时间了,在学习的同时也做了些笔记并发到了园子睐.看到园子里的大虾们在出了一系列文章后都会做个索引贴,这样很方便,所以本人今天抽了个空就把它整理了下,方便自己的同时也方便感兴趣的朋友.   Ruby学习笔记目录: 1.Ruby入门 2.Ruby-循环与选择结构 3.Ruby-String 4.Ruby-Array 5.Ruby-Hash 6.Ruby-Block, Proc and Lambda 7.Ruby-正则表达式 8.Ruby-Symbol 9.Ruby-Method,C

Ruby学习笔记

Ruby语言中,以对象为基本单位,可以说所有的元素都是对象.按照之前对于面向对象程序的理解,对象是指包含了特定属性和方法集合的一组程序.对象由类来定义,具体的表现为对象实例.也就是说,对象是类的实例化[2]. Ruby语言的基础元素 对象:数值对象.字符串对象.正则表达式对象.时间对象.文件对象.目录对象.数组.哈希.例外对象等 数值对象      由于Ruby中一切数据都是对象,所以我们处理的数字实际上也是对象.      a = 10,这样一个简单的赋值语句,实际上应当理解为 a = Num

Ruby学习笔记之Ruby 模块

介绍一种跟类相似的构造:模块(module).在设计程序的时候,我们会把大的组件分割成小块,你可以混合与匹配对象的行为. 跟类差不多,模块也捆绑方法与常量.不一样的是,模块没有实例.你可以把拥有特定功能的模块放到类或某个特定的对象里使用. Class 这个类是 Module 类的一个子类,也就是所有的 class 对象应该也是一个 module 对象. 上午10:26 *** 创建与使用模块 上午10:26 *** module MyFirstModule   def say_hello   p

Ruby学习笔记-Module

Module: 模块的定义和类比较相似,使用module关键字.但模块不能被实例化,也不能被子类化,模块是独立的,且一个模块对像是Module类的一个实例.模块最常用的两个用途是作为命空间和混入(mixin).       在模块中,可以定义实例变量.实例方法.类变量.类方法和属性等,并且在模块中还可能以定义类和模块.在类中也可以定义模块.       在访问模块中的实例成员,需要在类中饱含模块,然后实例化类以访问模块的实例成员.               module FirstModule

简明Python教程学习笔记_3_模块

模块 如果你想要在其他程序中重用很多函数,那么你该如何编写程序呢?你可能已经猜到了,答案是使用模块.模块基本上就是一个包含了所有你定义的函数和变量的文件.为了在其他程序中重用模块,模块的文件名必须以.py为扩展名. python有三种导入模块的方法 其一, import modname : 模块是指一个可以交互使用,或者从另一Python 程序访问的代码段.只要导入了一个模块,就可以引用它的任何公共的函数.类或属性.模块可以通过这种方法来使用其它模块的功能. 用import语句导入模块,就在当前

ruby学习笔记(1)--初识语法

虽然ruby/ruby on rails从2007年就一直获奖无数,但身为一个中国人,一直对小日本创造的东西不怎么感兴趣,想想其实也没必要,技术本身是无国界的,日本其实也有值得学习的地方(扯远了,呵) 单从技术而言,ruby本身确实很爽,令程序员的工作变得轻松有趣! 下面的代码演示了如何找出100以内的素数: using System; namespace Mersenne { class Program { static void Main(string[] args) { for (int

ruby学习笔记(2)--类的基本使用

ruby语言跟c#的一些重要差别在于: 1.ruby是动态语言,c#是静态语言--即对象在new出来以后,ruby还可以动态给对象实例添加一些属性或方法(javascript也是如此) 2.ruby中刻意弱化了变量类型这个概念,默认情况下变量/方法都不需要声明具体(返回)类型,但其实在ruby内部,会自动根据变量的值分配类型.(可以通过 "puts 变量.class"查看) 3.ruby相对c#来讲,可能有些雷的地方在于:父类中的private成员,居然是可以在子类中使用的! ...其

Ruby学习笔记之Ruby 对象

大部分 Ruby 程序,它们的设计,逻辑,动作,都是围绕着对象进行的.写一个 Ruby 程序,主要的工作就是去创建对象,然后给它们能力,让它们可以去执行动作. Ruby 是 OOP 语言,就是面向对象的语言,你执行的计算,数据处理,输入与输出这些动作,都是通过创建对象,然后让这个对象去执行指定的动作来完成的.对象(object)在现实世界里,就是一个东西.一个苹果是一个对象,一张桌子也是一个对象. 每个对象是一个特定的类的实例(instance),对象的行为大部分是在它们所属的那个类上面定义的方