首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候我应该使用Struct和OpenStruct?

什么时候我应该使用Struct和OpenStruct?
EN

Stack Overflow用户
提问于 2009-07-24 13:18:35
回答 4查看 69.1K关注 0票数 203

一般来说,与结构相比,使用OpenStruct的优点和缺点是什么?哪种类型的通用用例适合这些用例?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-24 13:43:31

使用OpenStruct,您可以任意创建属性。另一方面,在创建Struct时,必须定义它的属性。选择一个而不是另一个应该主要基于您是否需要能够在以后添加属性。

考虑它们的方式是作为散列和类之间的中间地带。与Hash相比,它们暗示了数据之间更具体的关系,但它们没有类那样的实例方法。例如,一个函数的一堆选项在散列中是有意义的;它们只是松散相关。函数所需的姓名、电子邮件和电话号码可以打包在一个StructOpenStruct中。如果姓名、电子邮件和电话号码需要以"First Last“和"Last,First”格式提供姓名,那么您应该创建一个类来处理它。

票数 189
EN

Stack Overflow用户

发布于 2010-11-10 03:56:55

与结构相比,OpenStructs使用的内存明显更多,而且执行速度更慢。

代码语言:javascript
复制
require 'ostruct' 

collection = (1..100000).collect do |index|
   OpenStruct.new(:name => "User", :age => 21)
end

在我的系统上,以下代码在14秒内执行,消耗1.5 GB内存。您的里程可能会有所不同:

代码语言:javascript
复制
User = Struct.new(:name, :age)

collection = (1..100000).collect do |index|
   User.new("User",21)
end

这几乎是瞬间完成的,并消耗了26.6MB的内存。

票数 24
EN

Stack Overflow用户

发布于 2017-05-23 04:42:33

Struct

代码语言:javascript
复制
>> s = Struct.new(:a, :b).new(1, 2)
=> #<struct a=1, b=2>
>> s.a
=> 1
>> s.b
=> 2
>> s.c
NoMethodError: undefined method `c` for #<struct a=1, b=2>

OpenStruct

代码语言:javascript
复制
>> require 'ostruct'
=> true
>> os = OpenStruct.new(a: 1, b: 2)
=> #<OpenStruct a=1, b=2>
>> os.a
=> 1
>> os.b
=> 2
>> os.c
=> nil
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1177594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档