继承
Ruby支持继承特性。to_s方法是Object内置方法。定义继承的方法
class Child < Parent #类似java的this的是#{self}
使用superclass来获取父类
class Parent end class Child < Parent end Child.superclass # => Parent 再往上就是Object 再往上就是BaseObject BasicObject.superclass.inspect # => "nil"
下面使用GServer类来演示一个通过继承实现TCP监听。
require 'gserver' class LogServer < GServer def initialize super(12345) end def serve(client) puts "client come in #{client}" client.puts get_end_of_log_file end private def get_end_of_log_file File.open("system.log") do |log| log.seek(-500, IO::SEEK_END) log.gets log.read end end end server = LogServer.new server.start.join
模块
模块可以是一组方法,类,或常量。它有两个好处:模块提供了命名空间,避免命名冲突,还有就是提供了mixin机制。
命名空间
Ruby的命名空间是定义在模块上,如下:
tut_modules/trig.rb module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end #另外一个模块中可以定义相同的sin方法 tut_modules/moral.rb module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end #模块常量与类常量一样,统一使用大写。模块方法与类方法定义方式也是一样。 使用这两个模块的代码示例 require_relative 'trig' requre_relative 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD) #使用方式:模块名.方法 模块名::常量
Mixins
mixin是通过模块来实现。
模块中定义的方法是以模块名为前缀+.,但是如果没有这个,就类似于类的实例方法。正是通过这种方式,来实现mixin。例如:
module Debug def who_am_i? "#{self.class.new} (id: #{self.object_id}): #{self.name}" end end class Phonograph include Debug attr_reader :name def initialize(name) @name = name end end p = Phonograph.new("eeee") p.who_am_i? #通过include模块,就可以使用模块的所有实例方法。
关于include:类中引入模块,是添加了一个到模块的引用,如果所引用的模块在其它文件中,需要通过require 来引用文件名。如果模块的方法有改动,将影响所有引用的类。在运行期也是一样。
通过使用这种方式,可以给类添加任意方法,实现了多重继承。
如果引入Compareable模块,则类就被添加了(<, <=, ==, >=, and >)操作符以及between?方法(注意操作表示类可以添加这种操作,如p1 > p2 )。这个模块假设引入它的类实现了<=>方法。然后它在需要的时候会回调。如下:
class Peron include Comparable attr_reader :name def initialize(name) @name = name end def to_s "#{@name}" end def <=>(other) self.name <=> other.name end end p1 = Person.new("Matz") p2 = Person.new("Guido") p3 = Person.new("Larry") # Compare a couple of names if p1 > p2 puts "#{p1.name}'s name > #{p2.name}'s name" end # Sort an array of Person objects puts "Sorted list:" puts [ p1, p2, p3].sort produces: Matz's name > Guido's name Sorted list: Guido Larry Matz
继承与mixin都可以给类添加方法。而mixin则实现了类似于多重继承。
Iterators and the Enumerable Module(迭代器与迭代模块)
Ruby有一个Enumerable模块,如果引入它,类将有map,include,find_all这些方法。而类要做的就是添加一个迭代方法each,返回自身要迭代的元素。
类似于: def each ['a', 'b'].each do |element| element end end
5.5 Composing Modules(组合模块)
Enumerable是标准的mixin,它添加了许多方法,其中包含inject方法,它的语义是:操作集合中的两个元素,把结果做为操作第三个元素的源,直到所有迭代完成。
[ 1, 2, 3, 4, 5 ].inject(:+) # => 15
( 'a'..'m').inject(:+) # => "abcdefghijklm"
我们也可以定义自己类引入Enumerable,并支持inject方法:
#查找元音,这个示例演示通过添加Enumerabler后,支inject方法 #其中要我们实现each方法。 class VowelFinder include Enumerable def initialize(string) @string = string end def each @string.scan(/aeiou/) do |vowel| yield vowel end end end vf = VowelFinder.new("the quick brown fox jumped") vf.inject(:+) # => "euiooue"
我们还可以通过给Ruby提供的类添加mixin,来新的方法
#通过将Array与Range两个类include我们自定义的mixin,就可以给它们添加方 #法,这个其实还演示了如何给存在类添加mixin。 module Summable def sum inject(:+) #注意,这个是假设引入类同时引入了Enumerable,因为这个类有 #inject方法 end class Array include Summable end [1,2,3,4,5].sum #=>15 ('a'..'m').sum # => "abcdefghijklm"
Mixins中的实例变量
不建议mixin中提供实例变量,因为如果它需要有自己的状态,那直接提供类好了。
方法的搜索顺序(同名的覆盖顺序)
查找顺序:class->mixins->superclasses(and their mixins)。如果有多个module mixin,则先搜索最后一个。
5.6 继承与Mixin的设计原则
继承用于is a,Mixin用于has a,use a。这类似于java的组合优先继承。
相关推荐
1. 导入PureRenderMixin:首先需要从`react-addons-pure-render-mixin`模块中导入这个混合物。 ```jsx var PureRenderMixin = require('react-addons-pure-render-mixin'); ``` 2. 应用到组件:将PureRenderMixin...
- 模块用于组织代码,可以包含常量、类方法和实例方法,也可以实现类的多重继承(mixin)。 - 源代码中会展示如何使用`include`和`extend`关键字引入模块。 4. **异常处理** - `begin-rescue-end`结构用于处理...
标题 "maven3-junit-spock-testng-mixin-master.rar" 暗示这是一个与 Maven、JUnit、Spock 和 TestNG 相关的项目源码压缩包。这个项目可能旨在展示如何在同一个测试环境中混合使用这些不同的测试框架,以便利用它们...
有关此mixin的装饰器版本,请参见 。 安装 npm install react-native-scrollable-mixin 用法 将ScrollableMixin添加到可滚动的React组件中,并实现getScrollResponder() ,该方法必须返回基础可滚动组件的滚动响应...
这样的设计模式在模块化和组件化的前端应用中非常有用,因为它促进了松耦合的代码结构。"event-emitter-mixin"库将事件发射器的功能与其他对象或类混合在一起,使得任何具备该混合功能的对象都能够触发和监听事件。 ...
vue-media-query-mixin一个vue mixin,用于获取当前的媒体查询xs,sm,md,lg和xl。 安装NPM npm安装vue-media-query-mixin YARN纱添加vue-media-query-mixin Vue mixin可以获取当前的媒体查询xs,sm,md,lg和xl。 ...
Sketch-CSS-Sprite-Mixin, 在草图中,生成一个 CSS Sprite Mixin到剪贴板的代码 绘制 CSS Sprite MixinSketch中生成 scss,LESS 和手写笔的mixin的代码。 运行插件时,代码被复制到剪贴板。子画面名称是顶级图层名,...
回送DS Mixin分页器 如何安装 npm install loopback-ds-paginator-mixin 或者 yarn add loopback-ds-paginator-mixin 如何使用 server/model-config.json { " _meta " : { " sources " : [ " loopback/common/...
该模块为状态和模型实现了dehydrate和rehydrate方法,以用作 Stores。 安装 npm install --save ampersand-model-fluxible-mixin 用法 使用 mixin 定义您的集合并为 Fluxible 设置storeName : // MyModel.js var...
react-backbone, Backbone 感知mixin用于响应和更多 反应中枢为 Backbone 提供对你的的响应,以响应你的组件,。将 backbone/backbone 。集合感知awareness你的反应组件mixin用于更新模型更改事件,请注意xhr活动和...
"ampersand-collection-single-request-mixin" 是一个专门为JavaScript开发的库,主要用于处理集合(collections)中的单一数据请求。在Web应用中,特别是在使用 Backbone.js 或 Ampersand.js 这样的MVC框架时,这样...
例如,如果有一个大型的模块只在特定的路由下使用,我们可以使用ember-lazy-loader-mixin来确保这个模块在用户导航到对应路由时才被加载。这样可以显著提升应用的启动速度,尤其是对于那些首次访问的用户来说。 ...
环回mixin设置可以在请求中写入哪些字段。 安装 npm install loopback-allowed-properties-mixin --save 用法 将mixins属性添加到您的server/model-config.json : { " _meta " : { " sources " : [ " ...
Vue在视口Mixin中 Vue 2 mixin通过使用更新Vue数据值来确定DOM元素在客户端窗口中何时可见。 然后,您可以使用这些数据值执行触发转换之类的操作。 您可能需要检查此软件包的指令vesion: 。 演示: : 安装 该...
MongoDB的回送聚合mixin 使模型能够查询本地MongoDB聚合并根据结果构建实例。 强调 接受回送过滤器的功能和管道阶段,它将合并在单个已解析的管道中以进行汇总。 接受根目录中的关系字段,它将作为$ lookup阶段...
React-Draggy-Drop-Mixin 是一个专门为 React 应用程序设计的 JavaScript 混合(mixin)组件,用于实现可拖放的功能。在 Web 开发中,尤其是在构建交互式用户界面时,可拖放功能是提升用户体验的重要手段。React-...
#react-validate-mixin npm install react-validate-mixin或者 bower install react-validate-mixin##例子 var validate = require ( 'react-validate-mixin' ) ;var Compoent = React . createClass ( { mixins ...
5. **模块**:Ruby的模块(Module)用于封装命名空间,实现类的多重继承,并提供混合(mixin)功能。 6. **元编程**:Ruby允许在运行时修改自己的代码,这是其强大之处,可以编写出高度自适应的代码。 7. **异常...
&符号集合休息混合 用于扩展mixin,具有按多个属性排序和升序/降序的能力。 在向集合中添加新模型或调用 sort() 方法时执行排序。安装 npm install ampersand-collection-sort-mixin用法mixin 使用存储在会话属性中...
vue-removed-hook-mixin 向组件添加一个removed钩子,表明$el从 DOM 中移除。 用法 // 1) Use the mixin in a single component. import addRemovedHook from "vue-removed-hook-mixin" ; export default { ...