Bird
Raised Fist0
Rubyprogramming~10 mins

Protected and private visibility in Ruby - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to make the method private.

Ruby
class Person
  def initialize(name)
    @name = name
  end

  [1] def secret
    "My name is #{@name}"
  end
end
Drag options to blanks, or click blank then click option'
Amodule
Bprotected
Cprivate
Dpublic
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'protected' instead of 'private' makes the method accessible to subclasses.
2fill in blank
medium

Complete the code to make the method accessible to instances of the same class and subclasses.

Ruby
class Person
  def initialize(name)
    @name = name
  end

  [1] def greet(other)
    "Hello, #{other.name}!"
  end

  attr_reader :name
end
Drag options to blanks, or click blank then click option'
Aprotected
Bpublic
Cprivate
Dmodule
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'private' prevents calling the method on other instances.
3fill in blank
hard

Fix the error in the code by choosing the correct visibility keyword for the method.

Ruby
class BankAccount
  def initialize(balance)
    @balance = balance
  end

  [1] def display_balance
    "Balance: $#{@balance}"
  end
end

account = BankAccount.new(1000)
puts account.display_balance
Drag options to blanks, or click blank then click option'
Aprivate
Bprotected
Cmodule
Dpublic
Attempts:
3 left
💡 Hint
Common Mistakes
Marking the method private or protected causes a NoMethodError when called externally.
4fill in blank
hard

Fill both blanks to define a protected method and call it from another instance of the same class.

Ruby
class User
  def initialize(name)
    @name = name
  end

  [1] def secret_message(other)
    "Secret for #{other.name}"
  end

  def reveal_secret(other)
    other.[2](self)
  end

  attr_reader :name
end
Drag options to blanks, or click blank then click option'
Aprotected
Bprivate
Csecret_message
Dgreet
Attempts:
3 left
💡 Hint
Common Mistakes
Using private keyword prevents calling the method on other instances.
5fill in blank
hard

Fill both blanks to define a private method and call it correctly inside the class.

Ruby
class SecretAgent
  def initialize(code_name)
    @code_name = code_name
  end

  def reveal
    [1]
  end

  [2] def code
    "Agent: #{@code_name}"
  end
end
Drag options to blanks, or click blank then click option'
Acode
Bprivate
Cself.code
Dpublic
Attempts:
3 left
💡 Hint
Common Mistakes
Calling private method with 'self.' causes an error.

Practice

(1/5)
1. Which statement best describes a private method in Ruby?
easy
A. It can be accessed from anywhere in the program.
B. It can only be called within the same object, not even by other instances of the same class.
C. It can be called by any object of the same class or its subclasses.
D. It is accessible only from outside the class.

Solution

  1. Step 1: Understand private method access

    Private methods in Ruby are only accessible within the same object, meaning you cannot call them on other instances, even if they belong to the same class.
  2. Step 2: Compare with other visibility levels

    Protected methods allow access from other instances of the same class or subclasses, but private methods do not.
  3. Final Answer:

    It can only be called within the same object, not even by other instances of the same class. -> Option B
  4. Quick Check:

    Private = same object only [OK]
Hint: Private = only inside same object, no other instances [OK]
Common Mistakes:
  • Thinking private methods can be called on other instances
  • Confusing private with protected visibility
  • Assuming private methods are accessible outside the class
2. Which of the following is the correct syntax to declare a private method in a Ruby class?
easy
A. private def method_name end
B. private def method_name; end
C. def private method_name; end
D. def method_name; private; end

Solution

  1. Step 1: Recall Ruby private method syntax

    In Ruby, you declare private methods by writing private on its own line, then defining the method below it.
  2. Step 2: Check each option

    private on its own line followed by def method_name end is correct syntax. Putting private on the same line as def, prefixing def with private, or placing private inside the method are invalid.
  3. Final Answer:

    private def method_name end -> Option A
  4. Quick Check:

    private keyword on separate line before method [OK]
Hint: Use 'private' on its own line before method definition [OK]
Common Mistakes:
  • Trying to put 'private' inside method definition line
  • Using 'private def' which is invalid syntax
  • Placing 'private' after method definition
3. What will be the output of this Ruby code?
class Person
  protected
  def secret
    "protected info"
  end

  public
  def reveal_secret(other)
    other.secret
  end
end

p1 = Person.new
p2 = Person.new
puts p1.reveal_secret(p2)
medium
A. SyntaxError
B. NoMethodError: protected method `secret' called
C. protected info
D. nil

Solution

  1. Step 1: Understand protected method access

    Protected methods can be called by other instances of the same class. Here, p1 calls reveal_secret passing p2, and inside it calls other.secret.
  2. Step 2: Predict output

    Since secret is protected, p1 can call secret on p2. The method returns "protected info", which is printed.
  3. Final Answer:

    protected info -> Option C
  4. Quick Check:

    Protected allows calls between same class instances [OK]
Hint: Protected allows access between same class instances [OK]
Common Mistakes:
  • Thinking protected methods can't be called on other instances
  • Expecting NoMethodError for protected method call
  • Confusing protected with private access
4. Identify the error in this Ruby code:
class Animal
  private
  def sound
    "roar"
  end

  def make_sound(other)
    other.sound
  end
end

lion = Animal.new
tiger = Animal.new
puts lion.make_sound(tiger)
medium
A. NoMethodError: private method `sound' called for tiger
B. No error, outputs 'roar'
C. SyntaxError due to private method
D. ArgumentError in make_sound method

Solution

  1. Step 1: Understand private method restrictions

    Private methods cannot be called with an explicit receiver, even if the receiver is an instance of the same class.
  2. Step 2: Analyze the method call

    In make_sound, other.sound calls a private method on another instance, which is not allowed and raises NoMethodError.
  3. Final Answer:

    NoMethodError: private method `sound' called for tiger -> Option A
  4. Quick Check:

    Private methods can't be called on other instances [OK]
Hint: Private methods can't be called with explicit receiver [OK]
Common Mistakes:
  • Assuming private methods can be called on other instances
  • Confusing private and protected method rules
  • Expecting no error when calling private method on other object
5. You want to allow instances of a class to call a method on each other but keep it hidden from outside calls. Which visibility should you use and how would you implement it?
class User
  # Your code here
  def compare_password(other)
    self.password == other.password
  end

  private
  def password
    "secret123"
  end
end

u1 = User.new
u2 = User.new
puts u1.compare_password(u2)
hard
A. Use attr_accessor for password and keep it private.
B. Make password a private method; this code works as is.
C. Make password public; private and protected won't work.
D. Make password a protected method; private won't allow other.password call.

Solution

  1. Step 1: Understand method visibility for inter-instance calls

    Private methods cannot be called with an explicit receiver, so other.password will fail if password is private.
  2. Step 2: Use protected visibility

    Protected methods allow calls between instances of the same class, so changing password to protected allows other.password to work while keeping it hidden from outside.
  3. Final Answer:

    Make password a protected method; private won't allow other.password call. -> Option D
  4. Quick Check:

    Protected allows inter-instance calls, private does not [OK]
Hint: Use protected for inter-instance method access [OK]
Common Mistakes:
  • Keeping password private and expecting inter-instance calls to work
  • Making password public and exposing sensitive data
  • Using attr_accessor without protection
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