讲讲 Ruby 中纯数据结构 ( Struct 与 OpenStruct )

ruby

我们知道在 C 与 C++ 中, 拥有 struct 这种纯粹存储数据类型的写法. 我们叫它结构体.

而且, 在有的时候, 这种用法非常有用, 例如, 我们要存储一张名片, 最简单的方式就是声明一个 Card 结构体:

// c code
#include <stdio.h>
struct card {
  char *name;
  char *addr;
};

int main(){
  struct card c;
  c.name = "yafei lee";
  printf("card: %p\n", c.name);
  return 0;
};

有人会问, 我用类就可以实现同样的功能了嘛,

# ruby code
class Card
  attr_accessor :name, :addr
end

c = Card.new
c.name = 'yafei lee'
puts c.name

但是, 我们却忽略了很多结构体的功能: 对比, 快速声明, 序列化. 这正是 StructOpenStruct 所带给大家的. 同样的问题, 我分别的用 StructOpenStruct 看下:

# ruby code
# struct
Card = Struct.new(:name, :addr)

c = Card.new
c.name = 'yafei lee'
puts c.name

c2 = Card.new
c2.name = 'yafei lee'
puts c2 == c # true

OpenStruct:

# ruby code
require 'ostruct'
Card = OpenStruct

c = Card.new
c.name = 'yafei lee'
puts c.name

c2 = Card.new
c2.name = 'yafei lee'
puts c2.name
puts c2 == c # true

可以看得出, StructOpenStruct 让声明结构体更加简单纯粹, 而不需要声明一个 "冗余" 的类, 加一堆属性. 除此之外, 它俩都可以帮助将 ==, eql? 这些事情做好. 最后还实现了 marshal_dumpmarshal_load, 满足持久化的功能: 什么是Marshal 持久化?

最后, 讲一下它俩之间的区别:

发表于 2013.09.28


匿名 • 2014-04-03 16:44

讲的很详细, 谢谢