讲讲 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
但是, 我们却忽略了很多结构体的功能: 对比, 快速声明, 序列化. 这正是 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-openstructStruct
是 Ruby 解释器内置, 用 C 实现;OpenStruct
是 Ruby 标准库, Ruby 实现- API 不同: Struct API 与 OpenStruct
发表于 2013.09.28
© 自由转载 - 非商用 - 非衍生 - 保持署名
匿名 • 2014-04-03 16:44
讲的很详细, 谢谢