# create a mapping of state to abbreviation states = { 'Oregon' => 'OR', 'Florida' => 'FL', 'California' => 'CA', 'New York' => 'NY', 'Michigan' => 'MI' } # create a basic set of states and some cities in them cities = { 'CA' => 'San Francisco', 'MI' => 'Detroit', 'FL' => 'Jacksonville' } # add some more cities cities['NY'] = 'New York' cities['OR'] = 'Portland' # puts out some cities puts '-' * 10 puts "NY State has: #{cities['NY']}" puts "OR State has: #{cities['OR']}" # puts some states puts '-' * 10 puts "Michigan's abbreviation is: #{states['Michigan']}" puts "Florida's abbreviation is: #{states['Florida']}" # do it by using the state then cities dict puts '-' * 10 puts "Michigan has: #{cities[states['Michigan']]}" puts "Florida has: #{cities[states['Florida']]}" # puts every state abbreviation puts '-' * 10 states.each do |state, abbrev| puts "#{state} is abbreviated #{abbrev}" end # puts every city in state puts '-' * 10 cities.each do |abbrev, city| puts "#{abbrev} has the city #{city}" end # now do both at the same time puts '-' * 10 states.each do |state, abbrev| city = cities[abbrev] puts "#{state} is abbreviated #{abbrev} and has city #{city}" end puts '-' * 10 # by default ruby says "nil" when something isn't in there state = states['Texas'] if !state puts "Sorry, no Texas." end # default values using ||= with the nil result city = cities['TX'] city ||= 'Does Not Exist' puts "The city for the state 'TX' is: #{city}"
创建函数
module Dict def Dict.new(num_buckets=256) #Initializes a Dict with the given number of buckets. aDict = [] (0...num_buckets).each do |i| aDict.push([]) end return aDict end def Dict.hash_key(aDict, key) # Given a key this will create a number and then convert it to # an index for the aDict's buckets. return key.hash % aDict.length end def Dict.get_bucket(aDict, key) #Given a key, find the bucket where it would go bucket_id = Dict.hash_key(aDict, key) return aDict[bucket_id] end def Dict.get_slot(aDict, key, default=nil) # Returns the index, key, and value of a slot found in a bucket. bucket = Dict.get_bucket(aDict, key) bucket.each_with_index do |kv, i| k, v = kv if key == k return i, k, v end end return -1, key, default end def Dict.get(aDict, key, default=nil) # Gets the value in a bucket for the given key, or the default. i, k, v = Dict.get_slot(aDict, key, default=default) return v end def Dict.set(aDict, key, value) # Sets the key to the value, replacing any existing value. bucket = Dict.get_bucket(aDict, key) i, k, v = Dict.get_slot(aDict, key) if i >= 0 bucket[i] = [key, value] else bucket.push([key, value]) end end def Dict.delete(aDict, key) # Deletes the given key from the Dict. bucket = Dict.get_bucket(aDict, key) (0...bucket.length).each do |i| k, v = bucket[i] if key == k bucket.delete_at(i) break end end end def Dict.list(aDict) # Prints out what's in the Dict. aDict.each do |bucket| if bucket bucket.each {|k, v| puts k, v} end end end end
修改后
require './dict.rb' # create a mapping of state to abbreviation states = Dict.new() Dict.set(states, 'Oregon', 'OR') Dict.set(states, 'Florida', 'FL') Dict.set(states, 'California', 'CA') Dict.set(states, 'New York', 'NY') Dict.set(states, 'Michigan', 'MI') # create a basic set of states and some cities in them cities = Dict.new() Dict.set(cities, 'CA', 'San Francisco') Dict.set(cities, 'MI', 'Detroit') Dict.set(cities, 'FL', 'Jacksonville') # add some more cities Dict.set(cities, 'NY', 'New York') Dict.set(cities, 'OR', 'Portland') # puts out some cities puts '-' * 10 puts "NY State has: #{Dict.get(cities, 'NY')}" puts "OR State has: #{Dict.get(cities, 'OR')}" # puts some states puts '-' * 10 puts "Michigan's abbreviation is: #{Dict.get(states, 'Michigan')}" puts "Florida's abbreviation is: #{Dict.get(states, 'Florida')}" # do it by using the state then cities dict puts '-' * 10 puts "Michigan has: #{Dict.get(cities, Dict.get(states, 'Michigan'))}" puts "Florida has: #{Dict.get(cities, Dict.get(states, 'Florida'))}" # puts every state abbreviation puts '-' * 10 Dict.list(states) # puts every city in state puts '-' * 10 Dict.list(cities) puts '-' * 10 # by default ruby says "nil" when something isn't in there state = Dict.get(states, 'Texas') if !state puts "Sorry, no Texas." end # default values using ||= with the nil result city = Dict.get(cities, 'TX', 'Does Not Exist') puts "The city for the state 'TX' is: #{city}"