📖 Scenario: You are building a simple program to store information about a book using a flexible object. This object should allow you to add new details easily without changing the class structure.
🎯 Goal: Create a dynamic object using OpenStruct to store book details, add a new attribute, and print the final information.
📋 What You'll Learn
Use Ruby's OpenStruct to create a dynamic object
Add initial attributes for title and author
Add a new attribute year after creation
Print the complete book information
💡 Why This Matters
🌍 Real World
OpenStruct is useful when you want to create objects that can change shape easily, like storing user settings or data from APIs without defining a full class.
💼 Career
Many Ruby developers use OpenStruct for quick prototyping and flexible data handling, especially in web development and scripting tasks.
Progress0 / 4 steps
1
Create an OpenStruct object with initial book details
Write code to require the ostruct library and create an OpenStruct object called book with title set to "The Ruby Way" and author set to "Hal Fulton".
Ruby
Hint
Use require 'ostruct' to load the library. Then create book with OpenStruct.new and pass a hash with keys :title and :author.
2
Add a new attribute for the publication year
Add a new attribute called year to the existing book object and set it to 2020.
Ruby
Hint
Use dot notation to add year to book like book.year = 2020.
3
Access and print the book's title and year
Write code to print the book's title and year using puts and string interpolation with book.title and book.year.
Ruby
Hint
Use puts with double quotes and #{} to insert book.title and book.year into the string.
4
Print the complete book object
Write code to print the entire book object using puts book.
Ruby
Hint
Simply use puts book to print all attributes of the OpenStruct object.
Practice
(1/5)
1. What is the main purpose of Ruby's OpenStruct?
easy
A. To improve performance of Ruby programs
B. To create objects with dynamic properties without defining a class
C. To enforce strict typing on object properties
D. To replace arrays with key-value pairs
Solution
Step 1: Understand what OpenStruct does
OpenStruct allows creating objects where you can add or change properties anytime without predefining a class.
Step 2: Compare options with OpenStruct's purpose
Options A, C, and D do not describe OpenStruct's main use. It is not about performance, strict typing, or replacing arrays.
Final Answer:
To create objects with dynamic properties without defining a class -> Option B
Quick Check:
OpenStruct = dynamic properties [OK]
Hint: OpenStruct = flexible object with changeable properties [OK]
Common Mistakes:
Thinking OpenStruct improves speed
Confusing OpenStruct with strict typing
Assuming OpenStruct replaces arrays
2. Which of the following is the correct way to create an OpenStruct object with a property name set to "Alice"?
easy
A. person = OpenStruct.new(name: "Alice")
B. person = OpenStruct(name = "Alice")
C. person = OpenStruct{name: "Alice"}
D. person = OpenStruct.new("name", "Alice")
Solution
Step 1: Recall OpenStruct initialization syntax
OpenStruct.new accepts a hash with symbol keys to set initial properties.
Step 2: Check each option's syntax
person = OpenStruct.new(name: "Alice") uses correct syntax with symbol key and value. person = OpenStruct(name = "Alice") uses wrong method call. person = OpenStruct{name: "Alice"} uses braces instead of parentheses. person = OpenStruct.new("name", "Alice") uses positional arguments which OpenStruct.new does not support.
Final Answer:
person = OpenStruct.new(name: "Alice") -> Option A
Quick Check:
OpenStruct.new(symbol: value) [OK]
Hint: Use OpenStruct.new with symbol keys for properties [OK]
Common Mistakes:
Using assignment inside parentheses
Using braces instead of parentheses
Using positional arguments instead of hash
3. What will be the output of the following Ruby code?
require 'ostruct'
person = OpenStruct.new
person.age = 30
puts person.age
OpenStruct allows adding properties dynamically by assignment, so person.age = 30 sets the age property to 30.
Step 2: Output the property value
Using puts person.age prints the value 30 stored in the age property.
Final Answer:
30 -> Option C
Quick Check:
Dynamic property assignment = 30 [OK]
Hint: Assign properties directly, then access them normally [OK]
Common Mistakes:
Expecting nil for uninitialized property
Thinking dynamic assignment causes error
Confusing with normal Struct behavior
4. Identify the error in this code snippet using OpenStruct:
require 'ostruct'
person = OpenStruct.new
person[:name] = "Bob"
puts person.name
medium
A. person.name is undefined because name was never set
B. Missing parentheses in OpenStruct.new
C. Cannot use puts with OpenStruct properties
D. OpenStruct does not support []= for setting properties
Solution
Step 1: Check how properties are set in OpenStruct
OpenStruct properties are set by dot notation (e.g., person.name = "Bob"), not by bracket notation.
Step 2: Analyze the code behavior
Using person[:name] = "Bob" tries to use []= method which OpenStruct does not support, causing an error.
Final Answer:
OpenStruct does not support []= for setting properties -> Option D
Quick Check:
Use dot notation, not []= [OK]
Hint: Set properties with dot, not brackets [OK]
Common Mistakes:
Using []= to set OpenStruct properties
Assuming OpenStruct supports hash-like access
Ignoring error messages
5. Given a hash data = {name: "Eve", age: 28, city: "NY"}, how can you create an OpenStruct object and then add a new property country with value "USA" dynamically?
hard
A. person = OpenStruct.new(data); person.country = "USA"
B. person = OpenStruct.new; person = data; person.country = "USA"
C. person = OpenStruct.new(data); person[:country] = "USA"
D. person = OpenStruct.new; person.add(:country, "USA")
Solution
Step 1: Initialize OpenStruct with existing hash
Use OpenStruct.new(data) to create an object with properties from the hash.
Step 2: Add new property dynamically
Assign new property with dot notation: person.country = "USA".
Step 3: Check incorrect options
person = OpenStruct.new; person = data; person.country = "USA" overwrites person with hash, losing OpenStruct. person = OpenStruct.new(data); person[:country] = "USA" uses []= which is invalid. person = OpenStruct.new; person.add(:country, "USA") uses a non-existent method add.
Final Answer:
person = OpenStruct.new(data); person.country = "USA" -> Option A
Quick Check:
Initialize with hash + dot assign new property [OK]
Hint: Initialize with hash, add properties by dot assignment [OK]
Common Mistakes:
Overwriting OpenStruct with hash
Using []= to add properties
Calling non-existent methods
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.