Ruby's Set class stores unique values and makes membership checks direct.

set A `Set` keeps one copy of each value, so adding a duplicate does not increase the size.

Set Basics

candidate
set_basics.rb
Replay: real traced execution (multi-file project)
require "set"

candidate = "trace"
topics = Set.new(["ruby", "docs"])

added = topics.add?(candidate)
contains_candidate = topics.include?(candidate)
sorted_topics = topics.to_a.sort
topic_list = sorted_topics.join("/")

puts "candidate=#{candidate}"
puts "added=#{!added.nil?}"
puts "contains=#{contains_candidate}"
puts "topics=#{topic_list}"
require "set"

candidate = "ruby"
topics = Set.new(["ruby", "docs"])

added = topics.add?(candidate)
contains_candidate = topics.include?(candidate)
sorted_topics = topics.to_a.sort
topic_list = sorted_topics.join("/")

puts "candidate=#{candidate}"
puts "added=#{!added.nil?}"
puts "contains=#{contains_candidate}"
puts "topics=#{topic_list}"
require "set"

candidate = "debug"
topics = Set.new(["ruby", "docs"])

added = topics.add?(candidate)
contains_candidate = topics.include?(candidate)
sorted_topics = topics.to_a.sort
topic_list = sorted_topics.join("/")

puts "candidate=#{candidate}"
puts "added=#{!added.nil?}"
puts "contains=#{contains_candidate}"
puts "topics=#{topic_list}"
  1. candidate ← trace, topics ← #<Set: {"ruby", "docs"}>, added ← (empty)

    1require "set"23candidate→ trace = "trace"  #@candidate="ruby", "debug"4topics→ #<Set: {"ruby", "docs"}> = Set.new(["ruby", "docs"])56added→ (empty) = topics.add?(candidate)#<Set: {"ruby", "docs", "trace"}>7contains_candidate→ true = topics.include?(candidate)true8sorted_topics→ ["docs", "ruby", "trace"] = topics.to_a.sort["docs", "ruby", "trace"]9topic_list→ docs/ruby/trace = sorted_topics.join("/")docs/ruby/trace1011puts "candidate=#{candidatetrace}"12puts "added=#{!added.nil?true}"13puts "contains=#{contains_candidatetrue}"14puts "topics=#{topic_listdocs/ruby/trace}"
    outputcandidate=trace
    added=false
    contains=true
    topics=docs/ruby/trace
  1. candidate ← ruby, topics ← #<Set: {"ruby", "docs"}>, added ← (empty)

    1require "set"23candidate→ ruby = "ruby"4topics→ #<Set: {"ruby", "docs"}> = Set.new(["ruby", "docs"])56added→ (empty) = topics.add?(candidate)(empty)7contains_candidate→ true = topics.include?(candidate)true8sorted_topics→ ["docs", "ruby"] = topics.to_a.sort["docs", "ruby"]9topic_list→ docs/ruby = sorted_topics.join("/")docs/ruby1011puts "candidate=#{candidateruby}"12puts "added=#{!added.nil?true}"13puts "contains=#{contains_candidatetrue}"14puts "topics=#{topic_listdocs/ruby}"
    outputcandidate=ruby
    added=false
    contains=true
    topics=docs/ruby
  1. candidate ← debug, topics ← #<Set: {"ruby", "docs"}>, added ← (empty)

    1require "set"23candidate→ debug = "debug"4topics→ #<Set: {"ruby", "docs"}> = Set.new(["ruby", "docs"])56added→ (empty) = topics.add?(candidate)#<Set: {"ruby", "docs", "debug"}>7contains_candidate→ true = topics.include?(candidate)true8sorted_topics→ ["debug", "docs", "ruby"] = topics.to_a.sort["debug", "docs", "ruby"]9topic_list→ debug/docs/ruby = sorted_topics.join("/")debug/docs/ruby1011puts "candidate=#{candidatedebug}"12puts "added=#{!added.nil?true}"13puts "contains=#{contains_candidatetrue}"14puts "topics=#{topic_listdebug/docs/ruby}"
    outputcandidate=debug
    added=false
    contains=true
    topics=debug/docs/ruby