
Security News
CISA’s 2025 SBOM Guidance Adds Hashes, Licenses, Tool Metadata, and Context
CISA’s 2025 draft SBOM guidance adds new fields like hashes, licenses, and tool metadata to make software inventories more actionable.
OpenStruct allows the creation of data objects with arbitrary attributes.
OpenFastStruct is a data structure, similar* to an OpenStruct, that allows the definition of arbitrary attributes with their accompanying values. It benchmarks ~3x slower than a Hash, but it's ~4x faster than OpenStruct.
*An OpenFastStruct is not exactly like an OpenStruct, these are the main differences between them:
person[:name]
.Install the gem:
$ gem install ofstruct
Use the gem in a project managed with Bundler adding it into the Gemfile:
gem "ofstruct"
require "ofstruct"
person = OpenFastStruct.new
person.name = "John Smith"
person.age = 70
puts person.name # -> "John Smith"
puts person.age # -> 70
puts person.address # -> #<OpenFastStruct>
An OpenFastStruct employs a Hash internally to store the methods and values and can even be initialized or updated with one:
require "ofstruct"
person = OpenFastStruct.new(:name => "John Smith")
puts person.name # -> "John Smith"
person.update(:name => "David Smith", :age => 70)
puts person.name # -> "David Smith"
puts person.age # -> 70
Removing the presence of a method requires the execution the #delete_field
method as setting the property value to a new empty OpenFastStruct.
require "ofstruct"
person = OpenFastStruct.new
person.name = "John Smith"
person.delete_field(:name)
puts person.name # -> #<OpenFastStruct>
An OpenFastStruct instance is a black hole object that supports infinite chaining of attributes.
require "ofstruct"
person = OpenFastStruct.new
person.address.number = 4
puts person.address.number # -> 4
Probably you heard that you should never, ever use OpenStruct because the performance penalty is prohibitive. You can use OpenFastStruct instead!
$ ruby benchmark/hash_ofstruct_ostruct.rb
Calculating -------------------------------------
Hash 25.518k i/100ms
OpenFastStruct 10.527k i/100ms
OpenStruct 3.236k i/100ms
-------------------------------------------------
Hash 487.517k (±11.9%) i/s - 2.399M
OpenFastStruct 159.952k (± 4.0%) i/s - 800.052k
OpenStruct 45.602k (± 4.7%) i/s - 229.756k
Comparison:
Hash: 487516.9 i/s
OpenFastStruct: 159952.4 i/s - 3.05x slower
OpenStruct: 45601.6 i/s - 10.69x slower
$ ruby benchmark/double_ofstruct_ostruct.rb
Calculating -------------------------------------
RSpec Stubs 103.000 i/100ms
OpenFastStruct 108.000 i/100ms
OpenStruct 45.000 i/100ms
-------------------------------------------------
RSpec Stubs 297.809 (±17.1%) i/s - 1.545k in 5.346697s
OpenFastStruct 262.381 (±12.2%) i/s - 1.404k in 5.430345s
OpenStruct 185.150 (± 7.0%) i/s - 945.000
Comparison:
RSpec Stubs: 297.8 i/s
OpenFastStruct: 262.4 i/s - 1.14x slower
OpenStruct: 185.2 i/s - 1.61x slower
FAQs
Unknown package
We found that ofstruct demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
CISA’s 2025 draft SBOM guidance adds new fields like hashes, licenses, and tool metadata to make software inventories more actionable.
Security News
A clarification on our recent research investigating 60 malicious Ruby gems.
Security News
ESLint now supports parallel linting with a new --concurrency flag, delivering major speed gains and closing a 10-year-old feature request.