Ruby模块和程序组织
和类一样,模块是一组方法和常量的集合。
和类不同,模块没有实例,取而代之的是可以将特殊模块的功能添加到一个类或者指定对象之中。
Class类是Module类的一个子类,因此每一个类对象也是一个模块对象
一、模块创建和基础应用
编写一个模块和编写类差不多,只是用module关键字在定义开始的位置取代class关键字而已。
Ruby模块是一种代码重用的方式,可以用来定义可重用的代码片段。模块中的方法可以被其他Ruby类或模块使用,就像它们是类的一部分一样。模块的名字就是模块的标识符,它不需要与文件名相同。
下面是一个创建和使用Ruby模块的基本示例:
# 创建一个模块
module MyModule def my_method "Hello, World!" end
end # 在另一个类中使用这个模块
class MyClass include MyModule def call_my_method my_method end
end # 创建一个对象并调用方法
obj = MyClass.new
puts obj.call_my_method # 输出 "Hello, World!"
在这个例子中,我们首先定义了一个名为MyModule的模块,其中包含一个名为my_method的方法。然后,我们在MyClass中通过include MyModule语句将这个模块包含进来。这样,我们就可以在MyClass中使用MyModule中的方法了。最后,我们创建了一个MyClass的对象,并调用了call_my_method方法,该方法内部调用了我们定义的my_method方法。
Ruby模块对于代码的组织和重用非常有用。它们可以包含一组相关的函数,这些函数可以在多个不同的类或对象中使用。通过使用模块,我们可以避免在多个地方重复编写相同的代码,并且可以使代码更加清晰、易于理解和维护。
1、使用模块封装一个栈
模块提供了一种收集和封装行为的方式。一个典型的模块包含一些方法,这些方法最终将会与拥有对象全部功能的一个特定子集关联。
栈是一种后进先出的数据结构,当设计一个程序,以及定义一种行为或行为的集合时,这些行为可能会被多个类型的实体或对象表现出来,这时模块就是一种好的备选方案。
module Stacklikedef stack@stack ||= []enddef add_to_stack(obj)stack.push(obj)enddef take_from_stackstack.popend
end
2、将模块混合到类中
模块没有实例,不能直接new一个。
require_relative "stacklike"
class Stackinclude Stacklike
end
注意类名是一个名词,而模块名称是一个形容词
二、模块、类和方法查找
1、方法查找
清晰地理解对象发现方法的方式是件有趣的事。看下面这个例子:
module M def reportputs "'report' method in module M"end
endclass C include M
endclass D < C
endobj = D.new
obj.report
实例方法report被定义在模块M中。而模块M被混合到了类C中。类D是C的子类,obj是D的一个实例。通过这样的层级关系,对象obj便可以访问report方法。
2、同名方法的多次定义
在类中定义一个方法两次,第二个定义将会取代第一次。这在模块中依然如此。
对象的方法可以从任意数量的类和模块中获得。
一个对象在其查找路径中有两个同名方法的另一种情况是:当一个类混合了两个或多个模块时,将搜索到方法的多个实现。这样的例子中,按照包含的逆序查找模块,这意味着最新混合到类中的模块将最先被搜索到。假如最新混合得到类的模块包含一个同名的方法,其方法在早先被混合的模块中出现过,最新被混合的模块中的那个版本的方法将会占据优先级,因为新混合的模块在查找路径中有最短的距离。
module M def reportputs "'report' method in module M"end
endmodule N def reportputs "'report' method in module N"end
endclass C include M include N
endc = C.new
c.report
这将会输出'report' method in module N
但是在包含N之后再次包含M
class C include M include N include M
endc = C.new
c.report
这仍将会输出'report' method in module N
。因为M已经存在于查找路径中,第二次包含M没有任何效果。N仍然被认为是最新引入的模块。
3、prepend
在Ruby中,prepend是一个方法,用于将一个模块或类添加到另一个类的继承链中。它使得被prepend的模块或类的方法在原类的方法之前被调用。
module MeFirstdef reportputs "Hello from module!"end
endclass Personprepend MeFirstdef reportputs "Hello from class!"end
endp = Person.new
p.report
运行这段代码将会输出
Hello from module!
4、方法查找的顺序
为了将消息解析为可用的方法,对象会在如下位置搜索方法
1、被前置在它所属类中的模块,按照与前置相反的顺序。
2、它的类中
3、被包含在它所属类中的模块,按照与包含相反的顺序
4、前置到它超类中的方法,按照与包含相反的顺序
5、它所属的超类
6、包含在它所属超类中的模块
7、同样地,达到Object和BasicObject
5、使用super向上追溯方法路径
在Ruby中,super关键字用于调用父类中的方法。当子类重写父类的方法时,使用super可以调用父类中被重写的方法。
class ParentClass def method "Parent method" end
end class ChildClass < ParentClass def method super.method + " child method" end
end child = ChildClass.new
puts child.method # 输出 "Parent method child method"
三、method_missing方法
method_missing是Ruby语言中的一个特殊方法。当试图调用一个不存在的方法时,Ruby会自动调用method_missing方法。这个方法允许你实现自定义的行为来处理缺失的方法调用。
class MyClass def method_missing(method_name, *args) if method_name.to_s == "hello" "Hello, World!" else super end end
end obj = MyClass.new
obj.hello # 输出 "Hello, World!"
obj.foo # 抛出 NoMethodError 异常,因为方法 "foo" 不存在
在上面的示例中,当调用obj.hello时,由于MyClass类中没有定义名为hello的方法,Ruby会自动调用method_missing方法。在method_missing方法中,我们根据方法名进行判断,如果方法名是"hello",则返回"Hello, World!“,否则调用super方法来抛出异常。这样,当我们调用obj.hello时,会得到预期的输出结果"Hello, World!”。而当我们尝试调用一个不存在的方法如obj.foo时,会抛出NoMethodError异常。
使用method_missing方法可以实现在运行时动态处理缺失的方法调用,提供了很大的灵活性和扩展性。但需要注意的是,过度使用method_missing可能会导致代码难以理解和维护,因此在使用时需要权衡利弊。
相关文章:
Ruby模块和程序组织
和类一样,模块是一组方法和常量的集合。 和类不同,模块没有实例,取而代之的是可以将特殊模块的功能添加到一个类或者指定对象之中。 Class类是Module类的一个子类,因此每一个类对象也是一个模块对象 一、模块创建和基础应用 编写…...
14、SpringCloud -- WebSocket 实时通知用户
目录 实时通知用户需求:代码:前端:后端:WebSocket创建 websocket-server 服务添加依赖:配置 yml 和 启动类:前端:后端代码:注意:测试:总结:实时通知用户 需求: 用户订单秒杀成功之后,对用户进行秒杀成功通知。 弹出个提示框来提示。 代码: 前端:...

智能井盖传感器推荐,万宾科技助力城市信息化建设
随着科技产品更新换代进程加快,人工智能在人们日常生活之中逐渐普及开来,深入人们生活的方方面面,影响城市基础设施建设工程。例如在大街小巷之中的井盖作为城市基础建设的一个重要部分,一旦出现松动倾斜或凸起等异常问题…...

3D模型格式转换工具HOOPS Exchange对工业级3D产品HOOPS的支持与应用
一、概述 HOOPS Exchange是一套高性能模型转换软件库,可以给软件提供强大的模型的导入和导出功能,我们可以将其单独作为转换工具使用,也可以将其集成到自己的软件中。 同样,HOOPS 的其它产品,也离不开HOOPS Exchange…...

table 表体滚动, 表头、表尾固定
在开发报表中,如果报表数据行过多页面无法全部显示,或者内容溢出div,需要把表头和表尾固定表体滚动这样就可以在页面上全部显示,并且不会溢出div 效果:最终实现效果 代码:<!DOCTYPE html> <html&g…...

第57篇-某钩招聘网站加密参数分析【2023-10-31】
声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析1.X-S-HEADER参数2.请求参数data3.响应机密值data一、前言 网址: aHR0cHM6Ly93d3cubGFnb3UuY29t…...

C语言数据结构之数据结构入门
目录 数据结构介绍 数据结构发展史 何为算法 数据结构基础 基本概念和术语 四大逻辑结构(Logic Structure) 数据类型 理解复杂度概念 时间空间复杂度定义 度量时间复杂度的方法 程序运行时的内存与地址 编程预备 数据结构介绍 数据结构发展…...

如何知道服务器的某个端口是否打开
1、telnet 命令:telnet ip port,port即端口,我们一般最常见的命令就是telnet,但是telnet使用的是tcp协议,换句话说telnet只能检测tcp的这个端口打开了没 若是端口打开,会出现下列信息 失败的是这个 如…...

【ICCV‘23】One-shot Implicit Animatable Avatars with Model-based Priors
文章目录 前置知识 前置知识 1)SMPL模型 \quad SMPL这类方法只建模穿很少衣服的人体(裸体模型),它只能刻画裸体角色的动画,并不能刻画穿衣服的人体的动画 2)data-efficient \quad 这个词推荐用ÿ…...

关于息肉检测和识别项目的总结
前言 整体的思路:首先息肉数据集分为三类: 1.正常细胞 2. 增生性息肉 3. 肿瘤要想完成这个任务,首先重中之重是分割任务,分割结果的好坏, 当分割结果达到一定的准确度后,开始对分割后的结果进行下游分类…...

Jetson Xavier NX FFmpeg支持硬件编解码
最近在用Jetson Xavier NX板子做视频处理,但是CPU进行视频编解码,效率比较地下。 于是便考虑用硬解码来对视频进行处理。 通过jtop查看,发现板子是支持 NVENC硬件编解码的。 1、下载源码 因为需要对ffmpeg进行打补丁修改,因此需要编译两份源码 1.1、编译jetson-ffmpeg …...

518抽奖软件,为什么说比别的抽奖软件更美观精美?
518抽奖软件简介 518抽奖软件,518我要发,超好用的年会抽奖软件,简约设计风格。 包含文字号码抽奖、照片抽奖两种模式,支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 精致美观功能 字体平滑无锯齿图片放大后清晰…...
React的组件学习
React的组件学习 参考资料:https://zh-hans.react.dev/learn/your-first-component 一、定义组件 export default function Profile() {return (<imgsrc"https://i.imgur.com/MK3eW3Am.jpg"alt"Katherine Johnson"/>) }以下是构建组件…...

uni-app配置微信开发者工具
一、配置微信开发者工具路径 工具->设置->运行配置->小程序运行配置->微信开发者工具路径 二、微信开发者工具开启服务端口...

肺癌不再是老年病:33岁作家的离世引发关注,有这些情况的请注意
近期,90后网络小说家七月新番和26岁男艺人蒋某某因肺癌去世,引发关注。他们都没有吸烟习惯,那么他们为什么会得肺癌呢?浙大二院呼吸内科副主任医师兰芬说,现在年轻人熬夜、加班导致身体过劳,在劳累情况下身…...

【兔子王赠书第4期】用ChatGPT轻松玩转机器学习与深度学习
文章目录 前言机器学习深度学习ChatGPT推荐图书粉丝福利尾声 前言 兔子王免费赠书第4期来啦,突破传统学习束缚,借助ChatGPT的神奇力量,解锁AI无限可能! 机器学习 机器学习是人工智能领域的一个重要分支,它的目的是让…...
Ubuntu18.04 ROS Melodic的cv_bridge指向问题(四种方式,包括opencv4)(转载)
转载自: 【精选】Ubuntu18.04 ROS Melodic的cv_bridge指向问题(四种方式,包括opencv4)_XiangrongZ的博客-CSDN博客...

Android任务栈和启动模式
Andrcid中的任务栈是一种用来存放Activity实倒的容器。任务最大的特点就是先进后出,它主要有两个基本操作,分别是压栈和出栈。通常Andaid应用程序都有一个任务栈,每打开一个Activity时,该Activity就会被压入任务栈。每销毁一个Act…...

电脑加密软件哪个好?电脑加密软件推荐
电脑是我们办公离不开的工具,而为了保护电脑数据安全,我们可以使用专业的电脑加密软件来进行加密保护。那么,电脑加密软件哪个好呢?下面我们就来了解一下。 文件加密——超级加密3000 想要安全加密电脑重要文件,我们可…...

如何优雅地单元测试 Kotlin/Java 中的 private 方法?
翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先,开发者应该测试代码里的 private 私有方法吗? 直接信任这些私有方法,测试到…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...

DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...