📖 Scenario: Imagine you have a simple calculator that can perform different operations like addition, subtraction, multiplication, and division. You want to call these operations dynamically based on user input.
🎯 Goal: Build a Ruby program that uses send to call calculator methods dynamically.
📋 What You'll Learn
Create a class Calculator with methods add, subtract, multiply, and divide
Create an instance of Calculator called calc
Create a variable operation that stores the method name as a symbol
Use send on calc with operation and two numbers to get the result
Print the result
💡 Why This Matters
🌍 Real World
Dynamic method calling is useful when you want to choose actions at runtime, like in calculators, menus, or command handlers.
💼 Career
Understanding <code>send</code> helps in metaprogramming and building flexible Ruby applications that adapt to different inputs or commands.
Progress0 / 4 steps
1
Create the Calculator class with methods
Create a class called Calculator with four methods: add, subtract, multiply, and divide. Each method takes two parameters a and b and returns the result of the operation.
Ruby
Hint
Define each method inside the class with two parameters and return the calculation.
2
Create an instance and set operation variable
Create an instance of Calculator called calc. Then create a variable called operation and set it to the symbol :multiply.
Ruby
Hint
Use Calculator.new to create the instance and assign :multiply to operation.
3
Use send to call the method dynamically
Use send on the calc object with the operation variable and the numbers 6 and 7 as arguments. Store the result in a variable called result.
Ruby
Hint
Use calc.send(operation, 6, 7) to call the method stored in operation.
4
Print the result
Print the value of the variable result.
Ruby
Hint
Use puts result to display the output.
Practice
(1/5)
1. What does the Ruby method send do when used like obj.send(:method_name)?
easy
A. Calls the method named method_name on obj dynamically.
B. Creates a new method called method_name on obj.
C. Deletes the method named method_name from obj.
D. Returns the name of the method as a string.
Solution
Step 1: Understand send usage
The send method calls a method on an object using the method's name given as a symbol or string.
Step 2: Analyze the example obj.send(:method_name)
This calls the method named method_name on obj dynamically at runtime.
Final Answer:
Calls the method named method_name on obj dynamically. -> Option A
Quick Check:
send calls methods dynamically [OK]
Hint: Remember: send calls methods by name on objects [OK]
Common Mistakes:
Thinking send creates or deletes methods
Confusing send with method name retrieval
Assuming send returns method names as strings
2. Which of the following is the correct syntax to call a method named greet on object user using send?
easy
A. user.send(greet)
B. user.send('greet')()
C. user.send['greet']
D. user.send(:greet)
Solution
Step 1: Recall send syntax
The method name should be passed as a symbol or string without parentheses after send.
Step 2: Check each option
user.send(greet) misses quotes or symbol, causing error. user.send(:greet) correctly uses a symbol :greet. user.send('greet')() wrongly adds parentheses after send call. user.send['greet'] uses incorrect bracket syntax.
Final Answer:
user.send(:greet) -> Option D
Quick Check:
Use symbol for method name in send [OK]
Hint: Use colon before method name symbol in send [OK]
Common Mistakes:
Passing method name without quotes or colon
Adding parentheses after send call
Using brackets [] instead of parentheses ()
3. What is the output of this Ruby code?
class Person
def greet(name)
"Hello, #{name}!"
end
end
p = Person.new
puts p.send(:greet, "Alice")
medium
A. Hello, Alice!
B. greet
C. NoMethodError
D. Hello, name!
Solution
Step 1: Understand the method call with send
The send method calls greet on p with argument "Alice".
Step 2: Evaluate the method output
The greet method returns "Hello, Alice!" which is printed by puts.
Final Answer:
Hello, Alice! -> Option A
Quick Check:
send calls greet with argument "Alice" [OK]
Hint: send passes arguments after method name [OK]
Common Mistakes:
Expecting method name string as output
Confusing argument passing with no arguments
Thinking send returns method object
4. Identify the error in this Ruby code snippet:
class Calculator
def add(a, b)
a + b
end
end
calc = Calculator.new
calc.send(:add, 5)
medium
A. send cannot be used with arguments
B. Method add does not exist
C. Missing second argument for method add
D. Syntax error in method definition
Solution
Step 1: Check method definition
The method add requires two arguments: a and b.
Step 2: Analyze the send call
The send call provides only one argument (5), missing the second argument.
Final Answer:
Missing second argument for method add -> Option C
Quick Check:
Method arguments must match when using send [OK]
Hint: Match method arguments count when using send [OK]
Common Mistakes:
Passing fewer arguments than method requires
Assuming send works without correct arguments
Thinking send changes method signature
5. You want to call different arithmetic methods (add, subtract, multiply) on a Calculator object dynamically based on user input stored in operation. Which Ruby code correctly uses send to achieve this?
class Calculator
def add(a, b); a + b; end
def subtract(a, b); a - b; end
def multiply(a, b); a * b; end
end
calc = Calculator.new
operation = :multiply
# Fill in the blank below to call the method dynamically
result = ???
puts result
hard
A. calc.send(:operation, 4, 5)
B. calc.send(operation, 4, 5)
C. calc.send('operation', 4, 5)
D. calc.send(operation())
Solution
Step 1: Understand dynamic method calling
The variable operation holds the symbol of the method to call.
Step 2: Use send with variable method name and arguments
Passing operation as the first argument to send calls the correct method with arguments 4 and 5.
Final Answer:
calc.send(operation, 4, 5) -> Option B
Quick Check:
send uses variable method names with arguments [OK]
Hint: Pass method name variable and args directly to send [OK]
Common Mistakes:
Passing method name as string literal instead of variable
Adding parentheses after variable name incorrectly
Using symbol literal instead of variable for method name
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.