我们知道在 C 与 C++ 中, 拥有 struct
这种纯粹存储数据类型的写法. 我们叫它 结构体.
而且, 在有的时候, 这种用法非常有用, 例如, 我们要存储一张名片, 最简单的方式就是声明一个 Card
结构体:
// c code
#include <stdio.h>
struct card {
char *name;
char *addr;
};
int main(){
struct card c;
c.name = "xxx";
printf("card: %s\n", c.name);
return 0;
};
有人会问, 我用类就可以实现同样的功能了嘛,
# ruby code
class Card
attr_accessor :name, :addr
end
c = Card.new
c.name = 'yafei lee'
puts c.name
但是, 我们却忽略了很多结构体的功能: 对比, 快速声明, 序列化. 这正是 Struct
与 OpenStruct
所带给大家的.
同样的问题, 我分别的用 Struct
和 OpenStruct
看下:
# 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
可以看得出, Struct
与 OpenStruct
让声明结构体更加简单纯粹, 而不需要声明一个 "冗余" 的类, 加一堆属性.
除此之外, 它俩都可以帮助将 ==
, eql?
这些事情做好. 最后还实现了 marshal_dump
与 marshal_load
, 满足持久化的功能: 什么是 Marshal 持久化?
最后, 讲一下它俩之间的区别:
Struct
需要开头明确声明字段; 而 OpenStruct
人如其名, 随时可以添加属性Struct
性能优秀; 而 OpenStruct
差不少, 约有几十倍, 具体的性能差距可看这里: http://stackoverflow.com/questions/1177594/ruby-struct-vs-openstruct
Struct
是 Ruby 解释器内置, 用 C 实现; OpenStruct
是 Ruby 标准库, Ruby 实现来自 WinDy Blog