美文网首页
Struct && OpenStruct

Struct && OpenStruct

作者: SecondRocker | 来源:发表于2019-11-11 15:59 被阅读0次

1 Struct
本质上是一个简单的类,它允许你在不用定义class的情况下封装属性和accessor方法。

Bonus = Struct.new(:score,:per_score,:rate)  do
  def bonus
    self.score*self.rate*self.per_score
  end
end
user1_bonus = Bonus.new(12,2,0.5)
user1_bonus.bonus #12

Struct 需要开头明确声明字段

user1_bonus.rate = 1
user1_bonus.rate #1
user1_bonus.bonus #24
user1_bonus.name= 'dong' # undefined method `name=' for #<struct Bonus score=12, per_score=2, rate=0.5>

 user1_bonus.to_json
 => "{\"score\":12,\"per_score\":2,\"rate\":0.5}" 
user1_bonus.to_h
 => {:score=>12, :per_score=>2, :rate=>0.5} 
Bonus.ancestors
 => [Bonus, Struct, Enumerable, Object, Kernel, BasicObject] 
Class.ancestors
[Class, Module, Object, Kernel, BasicObject] 

Struct 继承了 Enumerable,可以

 user1_bonus.each{|x| puts x}
12
2
0.5

优点:定义简便,结构清晰;只能调用定义好的,相比Hash不容易出错;ruby内置,直接使用;C实现,性能较好

2 OpenStruct
OpenStruct是一个类似Hash的数据结构,它允许我们使用对象自带的值定义任意的属性,相比hash可以 point调用,可动态添加属性;OpenStruct 是 Ruby 标准库内, Ruby 实现

require 'ostruct' #需要
a = OpenStruct.new name: 'dong',age: 12
OpenStruct.ancestors
 => [OpenStruct, ActiveSupport::ToJsonWithActiveSupportEncoder, Object, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, ActiveSupport::Tryable, ActiveSupport::Dependencies::Loadable, Kernel, BasicObject] 

a.to_h
 => {:name=>"dong", :age=>12} 
a.to_json
 => "{\"table\":{\"name\":\"dong\",\"age\":12}}" 
a.each{|x| puts x}
 => nil 

相关文章

  • Struct && OpenStruct

    1 Struct本质上是一个简单的类,它允许你在不用定义class的情况下封装属性和accessor方法。 Str...

  • Struct && OpenStruct

    一、需求 最近在做数据同步的应用,需要弄一个配置文件app.yml来进行应用的设置,例如: 读取出来很简单: 使用...

  • Ruby中的OpenStruct和Struct

    OpenStruct 如官方文档介绍, OpenStruct是一个类似Hash的数据结构,它允许我们使用对象自带的...

  • struct和typedef struct彻底明白了

    参看struct和typedef struct彻底明白了 typedef struct和struct的区别: ty...

  • golang 基础(17)struct

    struct 创建 struct 通过 type 关键字定义一个 struct ,定义 struct 结构包括哪些...

  • 结构体 数组 形参

    结构体复习 struct{ }bool; struct bool a; struct bool *b; 函数将含有...

  • 数据库

    struct & class C++中的struct是对C中的struct的扩充。和class一样,struct有...

  • C++ 中的struct

    C++ 中也有struct, 而这个struct 和C中的struct不同,是功能扩展了的struct,当时的背景...

  • Librdkafka对Kafka Message的封装和相关操作

    struct rd_kafka_message_t struct rd_kafka_msg_t struct rd...

  • 结构体、枚举

    //struct 后面那个要不要都行 typedef struct {//typedef struct后面也可以加...

网友评论

      本文标题:Struct && OpenStruct

      本文链接:https://www.haomeiwen.com/subject/xgwmiqtx.html