Ruby使用类组织对象
使用Object.new创建新对象,但是一次只使用一种方法,这是感受以对象为中心的Ruby编程的最佳方式之一。不过这种方式并不能很好地扩展,假如有一个正在运行地在线售票网站,然后其数据库必须处理数以百计地售票记录,那么可以在Ruby程序中寻找另外地一种方式去创建和操作类似的ticket的对象。
Ruby有一套完整的编程技术用于批量地创建对象,从而不必对每一个ticket定义一个独立的price方法。与之前不同的是通过定义一个ticket类可以让每一个独立的ticket对象自动拥有一个price方法。这一点和其他高级语言的类很像。
一、类的设计
定义一个类:
class Ticketdef event"Can't really be specified yet..." end
end
一个特殊对象管理的信息和数据体现了对象的状态。需要完成以下事情:
1、设置或重置对象的状态
2、回读状态
在Ruby对象中,提供了便捷的数据存储和取回的机制:实例变量。
实例变量使得独立的对象可以记住状态。实例变量和其他变量的机制十分相像:赋值,然后回读它们的值,可以把它们相加、打印。
3、实例变量总是以一个@开头
4、实例变量仅仅在它归属的对象内部可见
5、一个实例变量在类的其中一个方法中初始化。然后可以在这个类的任何方法中使用
class Persondef set_name(string)puts "Setting person's name..."@name = stringenddef get_nameputs "Returning the person's name..."@nameend
endjoe = Person.new
joe.set_name("Joe")
puts joe.get_name
类的初始化
编写一个类时,可以定义一个特殊的方法initialize。
这样这个方法将在每次创建类的实例时被创建,在创建对象时可以使用这个自动初始化的过程来设置对象的状态。这里在每个ticket对象被创建时,给它们指定一个地点和时间,可以把正确的值作为传递参数发送给Ticket.new,同样地,这些参数将被自动地发送给initialize。
class Ticketdef initialize(venue, date)@venue = venue@date = dateenddef venue@venueenddef date@dateend
end
th = Ticket.new("Town Hall", "11/12/13")
cc = Ticket.new("Convention Center", "12/13/14")
puts "We've created two tickets."
puts "The first is for a #{th.venue} event on #{th.date}"
puts "The second is for an event on #{cc.venue} event on #{cc.venue}"
运行这段代码,将得到
We've created two tickets.
The first is for a Town Hall event on 11/12/13
The second is for an event on Convention Center event on Convention Center
Setting person's name...
Returning the person's name...
Joe
二、使用语法糖的setter方法
语法糖(Syntax sugar)是计算机科学中的术语,指的是在编程语言中,使用更易理解和更具有描述性的语法来代替较为复杂或低级的语法。
语法糖可以使代码更易读、易写,也可以帮助程序员更快速地理解和领会代码的含义。它通常不会改变程序的行为,但可以使代码更易于维护和修改。
例如,在许多编程语言中,可以使用for-each循环来遍历数组和集合,而不需要像使用低级语言那样手动控制索引。这是一种语法糖,它使程序更易于编写和理解。
另一个例子是在许多语言中,可以使用lambda表达式(或称为匿名函数)来定义函数,而不需要使用声明完整的函数名称和定义函数体。这种语法糖可以使代码更简洁、更灵活。
能够编写以等号结尾的方法,实际上是Ruby提供了调用这种类型方法的语法糖来创造一些有趣的可能性。
在Ruby中,setter方法是一种用于修改变量的方法,通过在变量名后面添加一个冒号(:)和一个参数来实现。这种语法糖可以让代码更加简洁和易读。
class Person attr_accessor :name, :age def initialize(name, age) @name = name @age = age end def name=(name) @name = name.capitalize end def age=(age) @age = age.to_i end
end person = Person.new("john smith", "25")
puts person.name # 输出 "John Smith"
puts person.age # 输出 25 person.name = "jane doe"
puts person.name # 输出 "Jane Doe" person.age = "30"
puts person.age # 输出 30
在上面的示例中定义了一个Person类,它有两个属性name和age,以及它们的setter方法。在name的setter方法中,我们将传入的名称字符串转换为首字母大写的形式。在age的setter方法中,我们将传入的字符串转换为整数。通过使用attr_accessor方法,我们可以使用简洁的语法糖来访问和修改变量,而不需要显式地定义getter和setter方法。
三、属性和attr_*方法体系
在Ruby中,属性(attributes)是对象的实例变量(instance variables),它们是对象的内部状态,用于存储对象的数据。属性在类中定义,并且可以通过类的实例进行访问。
在Ruby中,有多种方式来定义属性,其中最常见的是使用attr_reader和attr_accessor方法体系。
1、attr_reader方法:这个方法用于定义只读属性,它防止通过实例对属性进行写操作,只允许通过实例进行读操作。它接受一个或多个属性名称作为参数,然后返回一个类型检查的访问器方法(getter method)来读取这些属性的值。
class Person attr_reader :name, :age
end person = Person.new
person.name = "John" # 报错,name属性不可写
puts person.name # 输出 "John"
2、attr_accessor方法:这个方法用于定义可读可写属性,它允许通过实例对属性进行读写操作。它接受一个或多个属性名称作为参数,然后返回一个类型检查的访问器方法(getter和setter方法)来读取和修改变量的值。
class Person attr_accessor :name, :age def name=(name) @name = name.capitalize end
end person = Person.new
person.name = "John" # 输出 "John"
puts person.name # 输出 "John"
person.age = "25" # 输出 25
puts person.age # 输出 25
使用attr_accessor方法定义的属性,如果没有显式定义访问器方法(getter和setter方法),则默认只允许通过实例进行读操作。如果需要显式定义访问器方法,则需要在定义属性后使用标准的getter和setter方法体系来定义它们。
四、继承和Ruby类层级结构
继承和Ruby的类层级结构紧密相关。在Ruby中,类是一种第一级的对象,这意味着你可以像其他对象一样创建和操作类。Ruby的类具有很多属性和方法,其中之一就是继承。
继承是面向对象编程中的一个重要概念,它允许我们在已有的类(父类或超类)的基础上创建新的类(子类)。子类继承并能使用父类的所有属性和方法,同时还可以定义自己特有的属性和方法。
在Ruby中,使用<符号来定义一个类继承另一个类。例如:
class Animal < LivingThing # code specific to Animals
end
这里,Animal类继承了LivingThing类。这意味着Animal类可以访问LivingThing类的所有属性和方法,同时还可以定义自己特有的属性和方法。
在Ruby中,有几种类型的继承:
1、单继承:一个类只能继承自一个父类。如上述示例所示。
2、混入(Mixin):这是一种将模块(module)的功能添加到类中的方式。模块是可以包含方法和常量的命名代码块。
module AnimalFeatures def has_heartbeat true end
end class Animal < LivingThing include AnimalFeatures
end
这里,Animal类不仅继承了LivingThing,还混入了AnimalFeatures模块。
3. 多重继承:在Ruby中,一个类可以继承自多个父类。这是通过使用<符号在类定义中一次引用多个父类来实现的。然而,多重继承可能会导致一些复杂的问题,特别是当不同的父类有同名的方法或属性时。
class Animal < Creature # Animal's code
end class Vehicle < Creature # Vehicle's code
end
五、常量
在Ruby中,常量(Constant)是程序中不会改变的值。Ruby中的常量具有全局作用域,可以在程序的任何地方访问和修改。
在Ruby中,常量定义使用全大写字母,并且单词之间使用下划线(_)连接。例如,下面是一个常量的定义:
class MyClass # 定义一个常量 MY_CONSTANT = "Hello, World!" def initialize # 在方法中使用常量 puts MY_CONSTANT end
end obj = MyClass.new # 输出 "Hello, World!"
相关文章:
Ruby使用类组织对象
使用Object.new创建新对象,但是一次只使用一种方法,这是感受以对象为中心的Ruby编程的最佳方式之一。不过这种方式并不能很好地扩展,假如有一个正在运行地在线售票网站,然后其数据库必须处理数以百计地售票记录,那么可…...
Spring Boot 中常用的注解@RequestParam
Spring Boot 中常用的注解RequestParam RequestParam 是 Spring Framework 和 Spring Boot 中常用的注解之一,用于从请求中获取参数值。它通常用于处理 HTTP 请求中的查询参数(query parameters)或表单数据。下面详细解释 RequestParam 的用…...
Spark工作流程
Spark 的整个工作流程可以概括为以下步骤: 创建 SparkSession: 应用程序首先需要创建一个 SparkSession 对象,它是与 Spark 的交互入口。SparkSession 提供了对核心功能和各个模块的访问。 加载数据: 使用 SparkSession 提供的 AP…...

IDEA如何设置项目包名分级
按上面的勾选即可!...

消防应急疏散指示系统在某生物制药工厂项目的应用
安科瑞 华楠 摘要 消防应急照明和疏散指示系统由控制器、集中电源和灯具(疏散指示灯具、应急照明灯具)等几部分组成。系统采用17寸工业平板电脑、Windonws7系统,可支持联动报警、系统监控、故障报警、自检、备电、记录存储与查询、导光流、…...

C语言文件操作(上)
文章目录 一、为什么使用文件二、什么是文件1.程序文件2.数据文件3.文件名 三、文件的打开与关闭1.文件指针2.文件的打开和关闭fopen 与 fclose 四、文件的顺序读写01 字符输出函数:fputs02 字符输入函数:fgetc03 文本行输出函数:fputs04 文本…...

二叉树的前 中 后序的非递归实现(图文详解)
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…...

.NET验收
验收通用模板: 1.该资料计划看几天? 实际看了几天? 计划7天,实际看了9天 2.多少天一篇总结?将总结列出来。 一周总结一篇。 博客地址:3.这个资料相较于之前资料共同的内容是什么? 不同的(需要强化学习)…...

C++11——lambda表达式
文章目录 1. C98对自定义类型的排序2. lambda表达式语法2.1 捕捉列表 3. lambda底层原理 1. C98对自定义类型的排序 在C98中,想要对自定义类型就行排序,我们得自己写仿函数来表明我们相对哪一项进行排序 struct Student {Student(string name, long id…...

美国加密货币交易和借贷平台Membrane Labs完成2000万美元融资
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于美国纽约的加密货币交易和借贷平台Membrane Labs今日宣布已完成2000万美元A轮融资。 参与本轮融资的投资机构包括:Brevan Howard Digital、Point72 Ventures、Jane Street Cap…...

8-k8s-污点与容忍
文章目录 一、概念二、相关操作三、实操污点NoSchedule四、实操污点NoExecute五、实操容忍 一、概念 污点与容忍 污点taints定义在节点之上的键值型属性数据。当节点被标记为有污点,那么意味着不允许pod调度到该节点。 容忍tolerations是定义在 Pod对象上的键值型属…...

钢铁异常分类140篇Trans 学习笔记 小陈读paper
钢铁异常分类 对比学习 比较好用 1.首先,为每个实例生成一对样本, 来自同一实例的样本被认为是正例, 来自不同实例的样本被认为是负例。 2.其次,这些样本被馈送到编码器以获得嵌入。 3.在对比损失[16]的影响下, …...

YOLOv5-理论部分
YOLOv5 作者: Ultralytics 论文源码: https://github.com/ultralytics/yolov5 Ultralytics:“超视觉技术” / “超视觉系统” 0. 引言 “YOLOv5 🚀 是世界上备受喜爱的视觉人工智能,代表了 Ultralytics 对未来视觉人工智能方法的开源研究&a…...
蓝桥等考C++组别一级004
第一部分:选择题 1、C L1(15分) 下列是编程语言的一项是( )。 A. C B. Word C. Excel D. PowerPoint 正确答案: A 2、C L1(15分) 仔细阅读以下程序代码,其中有…...

分布式服务的链路跟踪 Sleuth Micrometer zipkin OpenTelemetry
由来 在分布式应用开发过程中,一个请求会调用多个应用,会有那种需要知道各个应用之间耗时的想法,这样可以知道一个调用的总时长以及各个组件之间的处理耗时,后面方便定位问题。 理论依据 起源于 google dapper 论文 https://re…...

CUDA学习笔记4——自定义设备函数
自定义设备函数 核函数:__global__修饰;在设备中执行;设备函数:__device__修饰;在设备中执行;只能被核函数或其他设备函数调用;主机函数:__host__修饰(可省略࿰…...

微前端四:qiankun在开发中遇到的问题
在qiankun开发中会遇到很多问题,上一篇微前端三:qiankun 协作开发和上线部署其实也是在解决一些经常遇到的问题,下面的两点也算是比较经典的了 1、子应用图片路径问题 2、基座是Vue2.0 element ui 配合 子应用 Vue3.0 element plus 导致的样…...
Android DisplayPolicy增加一些动作,打开后台接口
Android DisplayPolicy增加一些动作,打开后台接口 前言一、了解android全局滑动事件的拦截二、修改1.DisplayPolicy.java修改 前言 一些后台接口 界面之类的不方便打开,但是测试需要用到,这里就添加一个10秒内上拉6下,打开一个后…...

基于Linux安装Hive
Hive安装包下载地址 Index of /dist/hive 上传解压 [rootmaster opt]# cd /usr/local/ [rootmaster local]# tar -zxvf /opt/apache-hive-3.1.2-bin.tar.gz重命名及更改权限 mv apache-hive-3.1.2-bin hivechown -R hadoop:hadoop hive配置环境变量 #编辑配置 vi /etc/pro…...

FPGA 图像缩放 1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持
目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包U…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...

边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...