ruby 使用Struct场景

替代类使用,节省代码,清晰简洁

使用Struct

SelectOption = Struct.new(:display, :value) do
def to_ary
[display, value]
end
end

option_struct = SelectOption.new("Canada (CAD)", :cad)

puts option_struct.display
# Canada (CAD)
puts option_struct.to_ary.inspect
# ["Canada (CAD)", :cad]

使用类
class SelectOption

attr_accessor :display, :value

def initialize(display, value)
@display = display
@value = value
end

def to_ary
[display, value]
end

end

option_struct = SelectOption.new("USA (USD)", :usd)

puts option_struct.display
# USA (USD)
puts option_struct.to_ary.inspect
# ["USA (USD)", :usd]

临时的数据结构

例如一个使用两个日期来过滤表单数据的例子,你可以在过滤的地方使用两个值,也可以创建一个FilterRange Struct结构, 这个结构有一个from_date和to_date属性, 你或许需要一个方法来统计两个日期间的数据,你也可以穿件一个类,但是用struct更简单,同时帮你清理代码

require ‘ostruct‘
require ‘date‘

SelectOption = Struct.new(:from_date, :to_date) do
def filter_data(date)
return true if from_date< date && to_date > date
end
end

option_struct = SelectOption.new(Time.now, Time.now+10)

p option_struct.filter_data(Time.now+4)

类内部数据

class Person

Address = Struct.new(:street_1, :street_2, :city, :province, :country, :postal_code)

attr_accessor :name, :address

def initialize(name, opts)
@name = name
@address = Address.new(opts[:street_1], opts[:street_2], opts[:city], opts[:province], opts[:country], opts[:postal_code])
end

end

leigh = Person.new("Leigh Halliday", {
street_1: "123 Road",
city: "Toronto",
province: "Ontario",
country: "Canada",
postal_code: "M5E 0A3"
})

puts leigh.address.inspect
# <struct Person::Address street_1="123 Road", street_2=nil, city="Toronto", province="Ontario", country="Canada", postal_code="M5E 0A3">

作为测试使用的Stub

KCup = Struct.new(:size, :brewing_time, :brewing_temp)
colombian = KCup.new(:small, 60, 85)

brewer = Brewer.new(colombian)
expect(brewer.brew).to eq(true)

Struct相比较penstruct,速度快, 但是openStruct可以动态添加属性,

australia = OpenStruct.new(:country => "Australia", :population => 20_000_000)

australia.name=‘jack‘

p australia

时间: 2024-10-21 21:56:25

ruby 使用Struct场景的相关文章

3-4 8精彩算法集合。struct(C,ruby)

在本章我遇到了c语言的struct数据,即自定义的数据结构.比如: struct edge { int u; int v; int w; }; 题目给了一组数据,用edge储存.需要按照w大小排序.我开始不知道如何用ruby实现,后来想到之前的题目也遇到过(小猫钓鱼).我定义了一个类,在类中储存了数据. 谷歌了一下,发现详细讲解ruby的struct的文章.下面是摘录和自己的理解:?? https://ruby-china.org/topics/21617  Ruby 中的 OpenStruct

Ruby stdlib 学习 —— OptionParser

http://ruby-doc.org/stdlib-2.3.3/libdoc/optparse/rdoc/OptionParser.html#method-c-new 阅读lib的文档,做个笔记.OptionParser 这个类用于,在写一些command line工具的时候,设置命令行参数选项.GetoptLong有类似的功能,不过文中建议使用OptionParser. 一.例:简单示例 (主要是入个门,顺便演示了下不带参数的选项该怎么处理,像-v, -f 那种)) 1 #直接存成test.

谈谈redis,memcache的区别和具体应用场景

时间:2016 十月 12 1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个内存key-value数据库,但是不支持数据的持久化,服务器关闭之后数据全部丢失.Memcached使用C语言开发,在大多数像Linux.BSD和Solaris等POSIX系统上,只要安装了libevent即可使用.在Windows下,它也有一个可用的非官方版本(http

Redis 的 5 个常见使用场景

Redis 的 5 个常见使用场景 提交 我的评论 加载中 已评论 Redis 的 5 个常见使用场景 2015-07-23 数据库开发 数据库开发 数据库开发 微信号 DBDevs 功能介绍 分享数据库相关技术文章.教程和工具,另外还包括数据库相关的工作.偶尔也谈谈程序员人生 :) (点击上方蓝字,快速关注我们) 英文:Joe Engel 译者:伯乐在线-刘晓鹏 网址:http://blog.jobbole.com/88383/ 点击"阅读原文"可查看本文网页版 在这篇文章中,我们将

Zookeeper场景实践:(4)命名服务

1.基本介绍 命名服务是指通过指定的名字来获取资源或者服务的地址,提供者的信息.利用Zookeeper很容易创建一个全局的路径,而这个路径就可以作为一个名字,它可以指向集群中的集群,提供的服务的地址,远程对象等.简单来说使用Zookeeper做命名服务就是用路径作为名字,路径上的数据就是其名字指向的实体. 阿里巴巴集团开源的分布式服务框架Dubbo中使用ZooKeeper来作为其命名服务,维护全局的服务地址列表.在Dubbo实现中: 服务提供者在启动的时候,向ZK上的指定节点/dubbo/${s

Zookeeper场景实践:(5)分布式通知/协调

1.基本介绍 通知/协调机制通常有两种方式. 系统调度模式:操作人员发送通知实际是通过控制台改变某个节点的状态,然后Zookeeper将这些变化发送给注册了这个节点的Watcher的所有客户端. 工作汇报模式:这个情况是每个工作进程都在某个目录下创建一个临时节点,并携带工作的进度数据.这样汇总的进程可以监控目录子节点的变化获得工作进度的实时的全局情况. 总的来说,利用Zookeeper的watcher注册和异步通知功能,通知的发送者创建一个节点,并将通知的数据写入的该节点:通知的接受者则对该节点

ZooKeeper场景实践:(6)集群监控和Master选举

1. 集群机器监控 这通常用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应.这样的场景中,往往有一个监控系统,实时检测集群机器是否存活. 利用ZooKeeper有两个特性(读可监控,临时节点),就可以实现一种集群机器存活性监控系统: 1. 客户端在节点 x 上注册一个Watcher,那么如果x的子节点变化了,会通知该客户端 2. 创建EPHEMERAL类型的节点,一旦客户端和服务器的会话结束或过期,那么该节点就会消失 利用这两个特性,可以分别实现对客服端的状

ZooKeeper场景实践:(7) 分布式锁

1.基本介绍 分布式锁是控制分布式系统之间同步访问共享资源的一种方式,需要互斥来防止彼此干扰来保证一致性.利用Zookeeper的强一致性可以完成锁服务.Zookeeper的官方文档是列举了两种锁,独占锁和共享锁.独占锁保证任何时候都只有一个进程能或者资源的读写权限.共享锁可以同时有多个读,但是同一时刻最多只能有一个写,读和写是互斥的. 2.场景分析 我们准备来实现互斥的锁,按照官网的思路,给定一个锁的路径,如/Lock,所有要申请这个锁的进程都在/Lock目录下创建一个/Lock/lock-的

一网打尽当下NoSQL类型、适用场景及使用公司

在过去几年,关系型数据库一直是数据持久化的唯一选择,数据工作者考虑的也只是在这些传统数据库中做筛选,比如SQL Server.Oracle或者是MySQL.甚至是做一些默认的选择,比如使用.NET的一般会选择SQL Server:使用Java的可能会偏向Oracle,Ruby是MySQL,Python则是PostgreSQL或MySQL等等. 原因很简单:过去很长一段时间内,关系数据库的健壮性已经在多数应用程序中得到证实.我们可以使用这些传统数据库良好的控制并发操作.事务等等.然而如果传统的关系