Ruby Language Niveaux d'accès


Exemple

Ruby a trois niveaux d'accès. Ils sont public , private et protected .

Les méthodes qui suivent les mots-clés private ou protected sont définies comme telles. Les méthodes qui précèdent sont implicitement public méthodes public .

Méthodes publiques

Une méthode publique doit décrire le comportement de l'objet en cours de création. Ces méthodes peuvent être appelées en dehors de la portée de l'objet créé.

class Cat
  def initialize(name)
    @name = name
  end

  def speak
    puts "I'm #{@name} and I'm 2 years old"
  end
  
  ...
end

new_cat = Cat.new("garfield")
#=> <Cat:0x2321868 @name="garfield">
 
new_cat.speak
#=> I'm garfield and I'm 2 years old

Ces méthodes sont des méthodes publiques ruby, elles décrivent le comportement d’initialisation d’un nouveau chat et le comportement de la méthode speak.

mot-clé public est inutile, mais peut être utilisé pour échapper private ou protected

def MyClass
  def first_public_method
  end

  private

  def private_method
  end

  public

  def second_public_method
  end
end

Méthodes Privées

Les méthodes privées ne sont pas accessibles de l'extérieur de l'objet. Ils sont utilisés en interne par l'objet. En utilisant à nouveau l'exemple de chat:

class Cat
  def initialize(name)
    @name = name
  end

  def speak
    age = calculate_cat_age # here we call the private method 
    puts "I'm #{@name} and I'm #{age} years old"
  end

  private
     def calculate_cat_age
       2 * 3 - 4 
     end
end

my_cat = Cat.new("Bilbo")
my_cat.speak #=> I'm Bilbo and I'm 2 years old
my_cat.calculate_cat_age #=> NoMethodError: private method `calculate_cat_age' called for #<Cat:0x2321868 @name="Bilbo">

Comme vous pouvez le voir dans l'exemple ci-dessus, l'objet Cat nouvellement créé a accès à la méthode calculate_cat_age interne. Nous affectons l' age variable au résultat de l'exécution de la méthode calculate_cat_age privée qui imprime le nom et l'âge du chat sur la console.

Lorsque nous essayons d'appeler la méthode calculate_cat_age dehors de l'objet my_cat , nous recevons une NoMethodError car elle est privée. Trouver?

Méthodes protégées

Les méthodes protégées sont très similaires aux méthodes privées. On ne peut pas y accéder en dehors de l'instance d'objet de la même manière que les méthodes privées ne peuvent pas l'être. Cependant, en utilisant la méthode self ruby, les méthodes protégées peuvent être appelées dans le contexte d'un objet du même type.

class Cat
  def initialize(name, age)
    @name = name
    @age = age
  end

  def speak
    puts "I'm #{@name} and I'm #{@age} years old"
  end

  # this == method allows us to compare two objects own ages. 
  # if both Cat's have the same age they will be considered equal.
  def ==(other)
     self.own_age == other.own_age
  end

  protected
     def own_age
        self.age
     end
end

cat1 = Cat.new("ricky", 2)
=> #<Cat:0x007fe2b8aa4a18 @name="ricky", @age=2>

cat2 = Cat.new("lucy", 4)
=> #<Cat:0x008gfb7aa6v67 @name="lucy", @age=4>

cat3 = Cat.new("felix", 2)
=> #<Cat:0x009frbaa8V76 @name="felix", @age=2>

Vous pouvez voir que nous avons ajouté un paramètre age à la classe cat et créé trois nouveaux objets chat avec le nom et l'âge. Nous allons appeler la méthode own_age protected pour comparer l'âge de nos objets de chat.

cat1 == cat2
=> false

cat1 == cat3
=> true

Regardez cela, nous avons pu récupérer l'âge de cat1 en utilisant la méthode protégée self.own_age et la comparer à l'âge de cat2.own_age appelant cat2.own_age intérieur de cat1.