Ruby Language Livelli di accesso

Esempio

Ruby ha tre livelli di accesso. Sono public , private e protected .

I metodi che seguono le parole chiave private o protected sono definiti come tali. I metodi che precedono questi sono metodi implicitamente public .

Metodi pubblici

Un metodo pubblico dovrebbe descrivere il comportamento dell'oggetto che si sta creando. Questi metodi possono essere richiamati dall'esterno dell'oggetto creato.

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

Questi metodi sono metodi ruby ​​pubblici, descrivono il comportamento per l'inizializzazione di un nuovo gatto e il comportamento del metodo speak.

public parola chiave public non è necessaria, ma può essere utilizzata per sfuggire a private o protected

def MyClass
  def first_public_method
  end

  private

  def private_method
  end

  public

  def second_public_method
  end
end

Metodi privati

I metodi privati ​​non sono accessibili dall'esterno dell'oggetto. Sono usati internamente dall'oggetto. Usando di nuovo l'esempio del gatto:

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">

Come puoi vedere nell'esempio sopra, l'oggetto Cat appena creato ha accesso al metodo calculate_cat_age internamente. Assegniamo l' age variabile al risultato dell'esecuzione del metodo private calculate_cat_age che stampa il nome e l'età del gatto sulla console.

Quando proviamo a chiamare il metodo calculate_cat_age dall'esterno dell'oggetto my_cat , riceviamo un NoMethodError perché è privato. Prendilo?

Metodi protetti

I metodi protetti sono molto simili ai metodi privati. Non è possibile accedere al di fuori dell'istanza dell'oggetto nello stesso modo in cui i metodi privati ​​non possono essere. Tuttavia, usando il metodo self ruby, i metodi protetti possono essere chiamati all'interno del contesto di un oggetto dello stesso tipo.

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>

Puoi vedere che abbiamo aggiunto un parametro età alla classe cat e creato tre nuovi oggetti gatto con il nome e l'età. Chiameremo il metodo protetto own_age per confrontare l'età dei nostri oggetti gatto.

cat1 == cat2
=> false

cat1 == cat3
=> true

Guardate questo, siamo stati in grado di recuperare l'età di cat1 usando il metodo protetto self.own_age e confrontarlo con l'età di cat2.own_age chiamando cat2.own_age all'interno di cat1.