我们知道在 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