Module_eval for dynamic behavior in Ruby - Step-by-Step Execution
module Greeter module_eval do def hello "Hello!" end end end puts Greeter.new.hello rescue 'No instance method'
| Step | Action | Evaluation | Result |
|---|---|---|---|
| 1 | Define module Greeter | Module Greeter created | Greeter module exists |
| 2 | Call module_eval with block defining method hello | Method hello defined inside Greeter | Greeter has method hello |
| 3 | Try to call Greeter.new.hello | Greeter.new raises NoMethodError | Rescue prints 'No instance method' |
| 4 | Include Greeter in a class Person | Person includes Greeter methods | Person instances have hello method |
| 5 | Create Person.new.hello call | hello method returns 'Hello!' | Output: Hello! |
| Variable | Start | After module_eval | After include in Person | After Person.new |
|---|---|---|---|---|
| Greeter | module defined | method hello added | unchanged | unchanged |
| Person | undefined | undefined | includes Greeter | instance created |
| person_instance | undefined | undefined | undefined | object with hello method |
module_eval runs code inside a module's context. It can add methods dynamically. Modules cannot be instantiated directly. Include modules in classes to use added methods. module_eval accepts strings or blocks. Useful for dynamic behavior.
Practice
What does module_eval do in Ruby?
Solution
Step 1: Understand the purpose of
module_evalmodule_evallets you run code inside a module's context, allowing you to add or change methods dynamically.Step 2: Compare options with the definition
Only "It allows adding or changing methods inside a module dynamically." correctly describes this dynamic behavior. Other options describe unrelated actions.
Final Answer:
It allows adding or changing methods inside a module dynamically. -> Option DQuick Check:
module_eval adds or changes methods = A [OK]
- Thinking module_eval deletes methods
- Confusing module_eval with module creation
- Assuming module_eval converts modules to classes
Which of the following is the correct syntax to define a method greet inside a module Mod using module_eval?
module Mod # Your code here end
Solution
Step 1: Recall correct module_eval syntax
You can pass a block to
module_evalwith method definitions inside curly braces.Step 2: Check each option's syntax
Mod.module_eval { def greet; 'Hi'; end } uses a block correctly. Mod.module_eval def greet; 'Hi'; end misses braces. Mod.module_eval('def greet; 'Hi'; end') has mismatched quotes (inner single quote breaks the outer single-quoted string), causing syntax error. Mod.module_eval :def greet; 'Hi'; end uses invalid symbol syntax.
Final Answer:
Mod.module_eval { def greet; 'Hi'; end } -> Option AQuick Check:
Block syntax with braces is correct = A [OK]
- Omitting braces for block
- Using invalid symbol syntax
- Confusing string and block syntax
What will be the output of the following Ruby code?
module M
module_eval do
def hello
'Hello from M'
end
end
end
class C
include M
end
puts C.new.helloSolution
Step 1: Understand method definition inside module_eval
The methodhellois defined inside moduleMusingmodule_eval, so it becomes an instance method ofM.Step 2: Check class inclusion and method call
ClassCincludesM, so instances ofChavehellomethod. CallingC.new.helloreturns 'Hello from M'.Final Answer:
Hello from M -> Option AQuick Check:
module_eval defines method, include makes it accessible = D [OK]
- Assuming method is not defined
- Confusing module_eval with class_eval
- Expecting syntax error from block
Identify the error in the following code snippet:
module M module_eval 'def greet; puts "Hi" end' end class C include M end C.new.greet
Solution
Step 1: Analyze module_eval string syntax
The string passed tomodule_evaldefines methodgreetcorrectly with a semicolon separating statements.Step 2: Check method availability and call
ClassCincludesM, sogreetis available to instances. CallingC.new.greetprints 'Hi'.Final Answer:
No error; code runs and prints 'Hi'. -> Option BQuick Check:
module_eval string defines method correctly = C [OK]
- Thinking semicolon is missing
- Assuming greet is not instance method
- Expecting runtime error from string eval
You want to dynamically add multiple methods foo and bar to a module Mod using module_eval. Which approach correctly adds both methods so they can be used by classes including Mod?
Solution
Step 1: Understand multiple method definitions with module_eval
You can define multiple methods in one block or multiple times with separate calls tomodule_eval. Both ways add instance methods to the module.Step 2: Evaluate each option
Mod.module_eval do def foo; 'foo'; end def bar; 'bar'; end end defines both as instance methods (no self.) in one block, correct. All of the above "All of the above" is incorrect. Mod.module_eval do def self.foo; 'foo'; end end Mod.module_eval do def self.bar; 'bar'; end end uses separate blocks butdef self.adds singleton methods to Mod, not instance methods. Mod.module_eval('def self.foo; "foo"; end') Mod.module_eval('def self.bar; "bar"; end') uses strings withdef self., same issue - not accessible afterinclude.Final Answer:
Mod.module_eval do def foo; 'foo'; end def bar; 'bar'; end end -> Option CQuick Check:
Block with plain def (no self) adds instance methods = A [OK]
- Thinking only one method per module_eval is allowed
- Confusing string and block syntax
- Using self.def for instance methods (makes singletons)
Ready to prove it?
Pass the test and this pattern moves unknown
