Bird
Raised Fist0
Rubyprogramming~20 mins

Open struct for dynamic objects in Ruby - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
OpenStruct Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this OpenStruct code?
Consider this Ruby code using OpenStruct. What will it print?
Ruby
require 'ostruct'
person = OpenStruct.new(name: 'Alice', age: 30)
puts person.name
puts person.age
Aname\nage
BError: undefined method 'name'
Cnil\nnil
DAlice\n30
Attempts:
2 left
💡 Hint
OpenStruct allows you to access keys as methods.
❓ Predict Output
intermediate
2:00remaining
What happens when you add a new attribute dynamically?
What will this Ruby code print?
Ruby
require 'ostruct'
obj = OpenStruct.new
obj.color = 'red'
puts obj.color
Ared
Bcolor
Cnil
DNoMethodError
Attempts:
2 left
💡 Hint
OpenStruct allows adding new attributes by assignment.
🔧 Debug
advanced
2:00remaining
Why does this OpenStruct code raise an error?
This code raises an error. What is the cause?
Ruby
require 'ostruct'
obj = OpenStruct.new
puts obj.size
AReturns 0 because OpenStruct is empty
BReturns nil because attribute is missing
CNoMethodError because 'size' is not defined
DSyntaxError due to missing attribute
Attempts:
2 left
💡 Hint
OpenStruct only has methods for keys you set.
❓ Predict Output
advanced
2:00remaining
What is the output of nested OpenStruct objects?
What will this Ruby code print?
Ruby
require 'ostruct'
address = OpenStruct.new(city: 'Paris', zip: '75000')
user = OpenStruct.new(name: 'Bob', address: address)
puts user.address.city
AParis
Bcity
Cnil
DNoMethodError
Attempts:
2 left
💡 Hint
OpenStruct objects can be nested as attribute values.
🧠 Conceptual
expert
2:00remaining
How does OpenStruct store its data internally?
Which statement best describes how OpenStruct stores its attributes internally?
AIt uses a database to store attributes persistently.
BIt stores attributes as instance variables with fixed names.
CIt stores attributes in a hash and defines methods dynamically for each key.
DIt stores attributes in an array indexed by insertion order.
Attempts:
2 left
💡 Hint
Think about how OpenStruct allows dynamic method calls for keys.

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

  1. Step 1: Understand what OpenStruct does

    OpenStruct allows creating objects where you can add or change properties anytime without predefining a class.
  2. 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.
  3. Final Answer:

    To create objects with dynamic properties without defining a class -> Option B
  4. 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

  1. Step 1: Recall OpenStruct initialization syntax

    OpenStruct.new accepts a hash with symbol keys to set initial properties.
  2. 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.
  3. Final Answer:

    person = OpenStruct.new(name: "Alice") -> Option A
  4. 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
medium
A. Error: undefined method 'age='
B. nil
C. 30
D. 0

Solution

  1. Step 1: Understand OpenStruct dynamic property assignment

    OpenStruct allows adding properties dynamically by assignment, so person.age = 30 sets the age property to 30.
  2. Step 2: Output the property value

    Using puts person.age prints the value 30 stored in the age property.
  3. Final Answer:

    30 -> Option C
  4. 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

  1. 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.
  2. Step 2: Analyze the code behavior

    Using person[:name] = "Bob" tries to use []= method which OpenStruct does not support, causing an error.
  3. Final Answer:

    OpenStruct does not support []= for setting properties -> Option D
  4. 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

  1. Step 1: Initialize OpenStruct with existing hash

    Use OpenStruct.new(data) to create an object with properties from the hash.
  2. Step 2: Add new property dynamically

    Assign new property with dot notation: person.country = "USA".
  3. 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.
  4. Final Answer:

    person = OpenStruct.new(data); person.country = "USA" -> Option A
  5. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard