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