📖 Scenario: You are creating a simple contact list where each contact has a name and a phone number. You will use a Ruby hash to store this information.
🎯 Goal: Build a Ruby hash that uses both symbols and strings as keys to store contact names and their phone numbers.
📋 What You'll Learn
Create a hash with symbol keys and string keys
Use exact keys and values as specified
Access and print the hash content
💡 Why This Matters
🌍 Real World
Storing contact information in hashes is common in many Ruby applications like address books or user profiles.
💼 Career
Understanding how to use symbols and strings as hash keys is important for Ruby developers working with data structures and APIs.
Progress0 / 4 steps
1
Create a hash with symbol keys
Create a Ruby hash called contacts with these exact entries: :alice with value "123-4567", and :bob with value "987-6543".
Ruby
Hint
Use the Ruby hash syntax with symbols as keys like alice: "123-4567".
2
Add string keys to the hash
Add two more entries to the contacts hash with string keys: "carol" with value "555-1234", and "dave" with value "555-5678".
Ruby
Hint
Use square brackets to add string keys like contacts["carol"] = "555-1234".
3
Access and print all contacts
Use a contacts.each loop with variables key and value to iterate over the contacts hash and create a new hash called formatted_contacts where keys are strings (convert symbols to strings) and values are the phone numbers.
Ruby
Hint
Use key.to_s to convert symbol keys to strings inside the loop.
4
Print the formatted contacts hash
Write puts formatted_contacts to display the formatted_contacts hash.
Ruby
Hint
Use puts to print the hash. The output will show keys as strings.
Practice
(1/5)
1. Which of the following is a valid way to create a Ruby hash with symbol keys?
easy
A. { name => "Alice", age => 30 }
B. { "name": "Alice", "age": 30 }
C. { :name => "Alice", "age": 30 }
D. { name: "Alice", age: 30 }
Solution
Step 1: Understand symbol key syntax
In Ruby, symbol keys can be written as name: value without the rocket (=>) syntax.
Step 2: Check each option's syntax
{ name: "Alice", age: 30 } uses symbol keys with colon syntax correctly. { "name": "Alice", "age": 30 } uses string keys with colon, which is invalid. { :name => "Alice", "age": 30 } uses rocket syntax for the symbol key correctly but attempts colon syntax after a string key, which is invalid. { name => "Alice", age => 30 } uses bare words without colon or rocket, which is invalid.
Final Answer:
{ name: "Alice", age: 30 } -> Option D
Quick Check:
Symbol keys use colon syntax = { name: "Alice", age: 30 } [OK]
Hint: Symbol keys use colon after name, not quotes or bare words [OK]
Common Mistakes:
Using quotes around symbol keys with colon syntax
Omitting colon or rocket for keys
Mixing string and symbol keys without proper syntax
2. Which of the following hash definitions will cause a syntax error in Ruby?
easy
A. { name => "Bob", age => 25 }
B. { :name => "Bob", :age => 25 }
C. { "name" => "Bob", "age" => 25 }
D. { name: "Bob", age: 25 }
Solution
Step 1: Review valid key syntax
Symbol keys can be written as :name => or name:. String keys must be quoted and use rocket syntax.
Step 2: Identify invalid syntax
{ name => "Bob", age => 25 } uses bare words as keys without colon or rocket, which is invalid and causes syntax error.
Final Answer:
SyntaxError -> Option A
Quick Check:
Bare words as keys need colon or rocket [OK]
Hint: Keys must be symbols with colon or strings with quotes and rocket [OK]
The hash has a symbol key :name and a string key "age". Accessing with matching key types returns values.
Step 2: Evaluate each puts statement
person[:name] returns "Carol". person["age"] returns 28. Both print on separate lines.
Final Answer:
Carol
28 -> Option A
Quick Check:
Match key types to get values = Carol
28 [OK]
Hint: Use matching symbol or string keys to access hash values [OK]
Common Mistakes:
Accessing string key with symbol or vice versa
Expecting mixed keys to be interchangeable
Forgetting keys are type-sensitive
4. Identify the error in this Ruby hash creation:
data = { :city => "Paris", country: "France", "population" => 2148327, state }
medium
A. Hash keys cannot mix symbols and strings
B. Incorrect symbol syntax for :city
C. Missing value for key 'state'
D. String keys must use colon syntax
Solution
Step 1: Check each key-value pair
Keys :city, country, and "population" have values. The key 'state' is written without a value, which is invalid.
Step 2: Identify syntax error
Every key in a hash must have a corresponding value. Missing value for 'state' causes syntax error.
Final Answer:
Missing value for key 'state' -> Option C
Quick Check:
All keys need values in hash = Missing value for key 'state' [OK]
Hint: Every key must have a value; check for missing pairs [OK]
Common Mistakes:
Leaving keys without values
Confusing symbol and string key syntax
Assuming mixed keys cause errors
5. Given the array arr = [["name", "Dave"], [:age, 40], ["city", "NY"]], which code correctly converts it into a hash with symbol keys where possible?
hard
A. hash = arr.to_h
B. hash = arr.map { |k, v| [k.to_sym, v] }.to_h
C. hash = arr.map { |k, v| [k, v] }.to_h
D. hash = arr.map { |k, v| [k.to_s, v] }.to_h
Solution
Step 1: Understand the array structure
The array has pairs with keys as strings or symbols. We want all keys as symbols where possible.
Step 2: Convert keys to symbols
hash = arr.map { |k, v| [k.to_sym, v] }.to_h converts each key to symbol using k.to_sym before creating the hash, ensuring keys are symbols.
Step 3: Check other options
hash = arr.to_h keeps keys as is (mixed). hash = arr.map { |k, v| [k, v] }.to_h keeps keys as is without conversion. hash = arr.map { |k, v| [k.to_s, v] }.to_h converts all keys to strings, not symbols.