In Ruby, sets have only unique elements. Like a hash, a set provides fast lookups. But it stores no values alongside the keys—it only stores keys.
Sets provide many logical methods for adding, removing and testing elements. We can use operations like subset for easy analysis.
This example creates a new Set with the Set.new
syntax. The argument to new()
is an array of 2 elements—each element is added to the set.
add()
method twice. One string
, "socrates," is added but already exists. The duplicate is not stored.size()
method on the set, which returns 3. The set has 3 elements because the duplicate was not retained.require "set" # Create new Set. s = Set.new(["plato", "socrates"]) # Add two more elements. s.add("cebes") s.add("socrates") # Get size. puts s.size() # See if Set includes this element. puts s.include?("socrates")3 true
Next, this program uses the merge()
method and the each()
iterator. With merge()
, we pass in a collection and the set adds all of its elements.
require "set" # Create set. s = Set.new(["x", "y"]) # Merge in these two elements. s.merge(["y", "z"]) # Iterate the set. s.each do |n| # Display the element. puts n endx y z
One common operation with a set is the "subset" test. We can determine if all elements from one set are contained within another.
require "set" # Contains three elements. set1 = Set.new [10, 20, 30] # Is a superset of set1. set2 = Set.new [10, 20, 30, 40, 50] # This is true. if set1 <= set2 puts true end # This is not evaluated to true. if set2 <= set1 puts false end # This is true. # ... Subset is the same as the <= operator. if set1.subset?(set2) puts true endtrue true
A set stores just keys, not values. In this way, it is like a hash with no values. In places where no values are required, this leads to clearer code.
Performance with sets is good—hashed lookups make searches faster. But the greater benefit with a set is its logical methods, which simplify code.