Ruby和面向对象技术
Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言,每个对象都是一个样例或者既定类的实例以及独立对象的行为。
一、创建一个通用对象
创建一个通用对象
obj = Object.new
定义通用对象的行为
def obj.talk puts "I am an object"puts "(Do you object?)"
end
定义带参数的方法
def obj.c2f(c)c * 9.0 / 5 + 32
end
任何方法的返回值与方法执行中最后一个表达式的计算值相等
Ruby提供了一个关键字明确地定义了返回值:return,这个关键字地使用通常是可选的,但是多数程序员都喜欢用它,因为它使隐式的返回值表达式变得显而易见。
def obj.c2f(c)return c * 9.0 / 5 + 32
end
假如需要返回多个值则必须使用它,这些值会自动被包装为一个数组。
二、制作一个对象
一张入场券是一个常见的对象,且有一组众人熟知的属性和行为。这里将从一个较高的视角来看待一个如入场券般的Ruby对象能做什么以及该对象对自身的理解。
创建一个ticket.rb
ticket = Object.newdef ticket.date"01/02/03"
end
def ticket.venue"Town Hall"
end
def ticket.event"Author's reading"
end
def ticket.performer"Mark Twain"
enddef ticket.seat"Second Balcony, row J, seat 12"
enddef ticket.price5.50
end
这个马克吐温的入场券是一个简单的例子,但是它包含了一些Ruby编程的重要流程和原则。这个最重要的经验就是:程序完成任何有用事情的信息都必须存储于对象之中。ticket对象拥有这些信息,通过方法的调用可以请求ticket对象返回信息
查询对象
print "This ticket is for: "
print ticket.event + ", at "
print ticket.venue + ", on "
puts ticket.date + "."
print "The performer is "
puts ticket.performer + "."
print "The seat is "
print ticket.seat + ", "
print "and it costs $"
puts "%.2f." % ticket.price
通过字符串插值缩短查询代码:
puts "This ticket is for: #{ticket.event}, at #{ticket.venue}" + "The performer is: #{ticket.performer}." + "The seat is: #{ticket.seat}, " + "The it costs #{"%.2f." % ticket.price}"
无论在插值运算符中的内容是什么,他都能被分步求值,求值的结果会被插入字符串中。
用方法表达布尔状态
def ticket.avai_status"sold"
end
def ticket.avai?false
endif ticket.avai?puts "You are in luck!"
elseputs "Sorry--that seat has been sold."
end
注意方法avai?以问号结尾
三、对象的原生行为
就算是新创建的对象也不会是一块白板。只要对象创建并存在,它就能响应一组消息。
输入以下命令可以查看原生方法的列表:
Object.new.methods.sort

这些原生方法中的一小部分是非常普遍和非常有用的。
1、用object_id表示唯一标识对象
在Ruby中,每个对象都有一个和它唯一关联的ID编号。可以通过请求一个对象的object_id获得一个对象的ID,使用如下类似的代码。
obj = Object.new
puts "The id of obj is #{obj.object_id}."
str = "Strings are objects too, and this is a string!"
puts "The id of the string object str is #{str.object_id}."
puts "And the id of the integer 100 is #{100.object_id}"
运行这段代码可以看到
The id of obj is 60.
The id of the string object str is 80.
And the id of the integer 100 is 201
在尝试确定两个对象是否相等的时候,每个对象都拥有一个唯一的ID编号是很有用的,可以通过判断object_id是否相等而判断两个对象是否相等。
a = Object.new
b = a
puts "a's id is #{a.object_id} and b's id is #{b.object_id}"
运行之后可以看到a和b的对象id是相同的。
2、用respond_to?方法查询对象的能力
Ruby对象响应消息。在程序运行期间的不同事件点,依赖于对象和为对象定义的各种方法,一个对象可能会响应指定的消息,也可能不会。所以可以使用respond_to?方法判断一个对象是否有某种方法。
if obj.respond_to?("talk")obj.talk
else puts "Sorry, the object doesn't understand the 'talk' message"
end
该方法时自省或者反射的一个例子,这两个词指的是可以在程序运行期间进行状态检测。Ruby提供了许多用于自省机制的工具。使用methods方法测试对象,是另一种自省和反射的技术。
3、用send方法发送信息给对象
如果希望从键盘输入合适的查询词组(venue、performer等),就能从ticket对象中得到信息,则需要把如下代码添加到已有的程序中:
print "Information desired: "
request = gets.chomp
该行代码可以从键盘中获取一行输入。这样可以使用双等号比较符测试两个不同的输入值,它会基于对象自身的内容对字符串进行比较,然后调用与值匹配的方法。
if request == "venue"puts ticket.venue
elsif request == "performer"puts ticket.performer
......
尽管如此,还是不得不继续编写整个入场券的属性列表,但那变得有些冗余了。
这里还有一个可选的方案:给ticket对象直接发送对应的词语。按如下方式替换前面例子里的代码:
if ticket.respond_to?(request)puts ticket.send(request)
else puts "No such information available"
end
这个版本中使用了send方法作为ticket对象获得消息的通用入口。这样可以避免整个可能的请求清单,并由处理ticket对象的消息执行该消息,以取代检查ticket对象所具有的能力。
还可以使用__send__或者public_send代替send,__send__方法比普通send更安全,而public_send不能访问私有方法。
四、方法参数
在编写方法的时候允许传递任意数量的参数,在单独的方法参数名称前使用一个*即可:
def obj.multi_args(*x)puts "I can take zero or more arguments!"
end
符号*x表示在调用方法的时候,可以提供任意数量的参数。变量x被分配一个对应任意参数的数组。可以在稍后使用数组每次测试其中的一个。
一般情况下,参数都是变量的引用,如果不想变量发生变化,可以传入s.dup复制了一个对象。
def change_string(s)s.replace("New String!")
end
s = "Original String"
change_string(s)
change_string(s.dup)
还可以冻结一个变量,冻结后不能再对这个变量发生改变
s.freeze
相关文章:
Ruby和面向对象技术
Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言,每个对象都是一个样例或者既定类的实例以及独立对象的行为。 一、创建一个通用对象 创建一个通用对象 obj Object.new定义通用对象的行为 def obj.talk puts "I am an object"p…...
C++11常用新特性——可变参数模板
可变参数模板 C11中,可变参数模板是一个非常强大的特性,它允许函数和类模板接受任意数量和类型的参数,这为类型的安全编程提供了更广泛的灵活性。下面我将详细介绍这一新特性。 基础概念: 可变参数模板允许你传递多个类型和数量…...
SpringCloud-Seata
一、介绍 (1)实现分布式事务 (2)解决Spring只支持单机事务 (3)事务ID TC(事务协调者) TM(事务管理者) RM(资源管理者)...
java击球小游戏运行代码
创建一个图形化的小游戏通常需要使用Java图形库,例如Swing或JavaFX。下面是一个使用JavaFX创建的简单的图形化小游戏示例,其中一个小球会在窗口内移动,你需要点击小球以增加得分: import javafx.application.Application; import…...
Hadoop面试题+详解
20道面试题及详细解答! 1.说说什么是结构化数据、非结构化数据和半结构化数据 结构化数据、非结构化数据和半结构化数据是根据数据的组织结构和格式来划分的不同类型的数据。 结构化数据:结构化数据是按照预定义的数据模型进行组织和存储的数据。它通常…...
PDF编辑阅读:Acrobat Pro DC 2021中文稳定版
Acrobat Pro DC 2021是一款专业的PDF编辑和阅读软件。它可以创建、编辑、组合、签署和分享PDF文件,提供了许多强大的功能,如PDF文件转换、OCR识别、PDF文件合并、加密和解密等等。Acrobat Pro DC 2021的界面简单直观,易于使用,而且…...
单词规律(C++解法)
题目 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern "abba", s …...
MySQL 主从复制原理
文章目录 1.主从复制方式1.1 异步复制1.2 半同步复制1.3 全同步复制 2.主从复制原理3.主从复制时推还是拉?参考文献 主从复制是 MySQL 高可用(备份)和高性能(读写分离)的基础,有了这个基础,MySQ…...
构建嵌入式Linux rootfs根文件系统
创建根文件系统涉及选择系统运行所需的文件。在本节中,我们将介绍如何构建压缩的根文件系统。不太常见的选择是在直接作为 root 挂载的本地驱动器上构建未压缩的文件系统。 转载请注明来源,谢谢。构建嵌入式Linux rootfs根文件系统-CSDN博客创建根文件系…...
高速电路设计----第三章
一、数字信号需要上拉的情况 1、 一般信号上拉接多大的电阻要看对于芯片的电流要求。看芯片datasheet的I(BHLO)和I(BHHO)两个参数。平时的话: 3.3V的上拉为1K~3.3k即可 5V的上拉电阻为4.7K到10K即可。 2、数字信号的逻辑控制&a…...
【微信小程序】6天精准入门(第4天:自定义组件及案例界面)附源码
一、自定义组件 1、介绍 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页…...
pragma once与ifndef的区别
概要 代码编译过程中,为了防止同一份代码被重复引用,通常有两种实现方式 方式一 #pragma once 方式二 #ifndef _TEST_H_ #define _TEST_H_ #endif // !TEST_H 通常情况下,使用上述两种方式中的任意一种都是可以的。最近工作中,代…...
52单片机独立键盘控制数码管计数
前言 使用52单片机实现独立键盘控制数码管计数 代码 #include<reg52.h> #define uchar unsigned char #define uint unsigned intsbit key2 P3^4; sbit key3 P3^5; sbit key4 P3^6; sbit key5 P3^7;char code smg[] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x…...
完美解决 在将最终稿件上传到 IEEE PDF eXpress进行格式检查是出现“font not embedded“的问题 (不会出现自动压缩图像的现象)
最近中了一篇IEEE的论文,在校稿阶段,final paper是需要通过IEEE PDF eXpress网站的格式检查,然后出现一下问题: Errors: Font TimesNewRomanPS-BoldMT, TimesNewRomanPS-ItalicMT, TimesNewRomanPSMT is not embedded 用人话说就…...
零基础学习CSS
01-CSS初体验 层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言,用来描述 HTML 文档的呈现(美化内容)。 书写位置:title 标签下方添加 style 双标签,style 标签…...
基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(五)FineBI可视化
文章目录 22:FineBI配置数据集23:FineBI构建报表24:FineBI实时配置测试附录二:离线消费者完整代码 22:FineBI配置数据集 目标:实现FineBI访问MySQL结果数据集的配置 实施 安装FineBI 参考《FineBI Windows…...
Python逆向爬虫案例: 某网站AES逆向解密
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了࿰…...
ONNX runtime本地终端部署
1、class_index.csv文件: ID,English,Chinese 0,A,你 1,B,我 2,C,他 3,D,她2、classification.onnx 3、单张图像处理代码如下: import onnxruntime import torch import torch.nn.functional as F import pandas as pd from PIL import Image from tor…...
Linux性能优化--性能工具:特定进程CPU
4.0 概述 在用系统级性能工具找出是哪个进程降低了系统速度之后,你需要用特定进程性能工具来发现这个进程的行为。对此,Linux提供了丰富的工具用于追踪一个进程和应用程序性能的重要统计信息。 阅读本章后,你将能够: 确定应用程…...
技术人员转岗产品经理,有优势吗?
产品经理是一个非技术型的岗位,但是懂一些技术相关的知识会更好的和技术部门沟通,能更好的从技术部门的角度理解需求的可行性。所以这么说来,技术转产品经理相对来说更加有优势。 任何事情不可能都是只有好处没有坏处的,同样的&a…...
LinkSwift:终极免费网盘直链下载助手完整使用指南
LinkSwift:终极免费网盘直链下载助手完整使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...
从源头到治理:光伏并网逆变器直流分量抑制技术全解析
1. 光伏并网逆变器直流分量问题概述 第一次在光伏电站现场看到直流分量超标告警时,我盯着监控屏幕愣了半天。作为从业多年的光伏系统工程师,我深知这个看似微小的技术指标背后隐藏着多大的隐患。直流分量就像电网中的"隐形杀手",它…...
TVA智能体范式的工业视觉革命(3)
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
【NotebookLM林业科研提效指南】:3大AI笔记工作流重构传统林学研究范式
更多请点击: https://codechina.net 第一章:NotebookLM林业科学研究 NotebookLM 是 Google 推出的基于 AI 的研究协作者工具,专为文献理解与知识整合设计。在林业科学研究中,它可高效处理林学专著、野外调查报告、遥感解译文档、…...
长期使用Taotoken聚合服务对开发效率的实际提升感受
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken聚合服务对开发效率的实际提升感受 作为一名在多个项目中集成大模型能力的开发者,我过去需要为不同的…...
别只盯着SysTick_Config:用CubeMX配置STM32的SysTick中断并驱动OLED(附代码)
从CubeMX到OLED:SysTick中断在HAL库中的实战应用 引言 在嵌入式开发领域,精确的时间控制往往是项目成功的关键。对于STM32开发者而言,SysTick定时器作为Cortex-M内核的标准配置,提供了简单可靠的时间基准解决方案。不同于传统寄存…...
卡梅德生物技术快报|单 B 细胞抗体制备:流程优化、表达系统适配与性能数据
正文单克隆抗体制备是生物医学与兽医领域的核心技术。单 B 细胞抗体制备作为新一代技术,在筛选效率、基因天然性、制备周期上优势显著。本文从研发视角,按提出问题 — 分析问题 — 解决问题 — 效果数据,系统阐述单 B 细胞抗体制备的技术细节…...
别再手动折腾了!用Docker Compose 5分钟搞定Kamailio + MySQL + RTPproxy完整SIP服务栈
5分钟极速搭建Kamailio SIP服务栈:Docker Compose实战指南 在VoIP开发领域,快速搭建可靠的SIP服务环境是每个开发者都会遇到的基础需求。传统的手动部署方式往往需要数小时甚至更长时间,涉及复杂的依赖安装、配置文件修改和服务调优。而今天&…...
多智能体协同控制未来的前景和方向如何?
在AI技术快速演进的今天,单一智能体已难以满足企业复杂业务场景的需求,多智能体协同正成为行业关注的焦点,它通过多个智能体分工协作、动态交互,形成更强大、更灵活的数字员工团队,有望重塑企业运营模式,推…...
Multisim导入自定义三极管S8050/S8550保姆级教程:从SPICE文件到成功仿真
Multisim实战:从零构建S8050三极管模型与仿真验证全流程 在电子电路设计与仿真领域,准确的三极管模型往往是项目成功的关键。许多工程师和爱好者在使用Multisim时都遇到过这样的困境:官方元件库中缺少特定型号的三极管(如常见的S8…...
