traduzione - ruby tutorial




Cercando di imparare/capire i metodi setter e getter di Ruby (3)

Sto solo imparando a programmare e ho deciso di provare Ruby. Sono sicuro che questa è una domanda stupida, ma l'istruttore parla di metodi setter e getter e sono confuso. Ecco l'esempio:

class Human
  def noise=(noise)
    @noise = noise
  end

  def noise
    @noise
  end
end

Da questo, la classe viene istanziata e posso metterla in chiaro:

man = Human.new
man.noise=("Howdie!")
puts man.noise

Ciò si traduce in Howdie!

Ora ciò che mi confonde è che l'istruttore sta dicendo senza il metodo getter (il 2 ° dei due metodi), non c'è modo di interagire con la variabile d'istanza @noise.

Ma quando rimuovo il metodo getter, posso comunque accedere a @noise, vedi esempio:

class Human
  def noise=(noise)
    @noise = noise
  end
end

man = Human.new
puts man.noise=("Howdie!")

Funziona allo stesso modo del metodo getter utilizzato.

Quindi ora sono confuso. Perché è necessario il getter? Cosa significa l'istruttore non potendo accedere alla variabile di istanza senza di essa? È possibile che stia usando una versione precedente di Ruby?

Grazie in anticipo per il vostro aiuto.


È possibile interagire con tale variabile di istanza da altri metodi appartenenti a tale istanza, anche se non è presente getter:

def noise=(noise)
  @noise = noise
end

def last_noise
  @noise
end

Non c'è bisogno di essere un getter definito con lo stesso nome del metodo; i due non sono affatto collegati. Il getter è necessario per "ottenere" il valore della variabile di istanza, ma solo in una sintassi breve .

Quello che sta succedendo nel tuo esempio è che stai inizializzando un nuovo oggetto ( Human.new ), e quindi usando un metodo ( noise= , yes il nome del metodo contiene il simbolo = ) che solo così avviene per definire una variabile di istanza ( cioè, una variabile solo per quell'istanza), e quindi finalmente recuperare quella variabile di istanza con un'altra chiamata di metodo.

In realtà puoi usare instance_variable_get per ottenere la variabile di istanza senza definire alcun getter:

man = Human.new
man.noise = "Howdie"
man.instance_variable_get("@noise")

Ciò restituirà "Howdie", anche se non è definito alcun getter.

E no, non penso che stia usando una versione precedente di Ruby.


La linea di codice

puts man.noise=("Howdie!")

NON usa il metodo getter, quindi il metodo getter non ha bisogno di essere definito perché funzioni. Quella linea usa solo il metodo setter. Il valore di ritorno del metodo setter è automaticamente uguale a quello che si trova sul lato destro del segno di uguale, quindi "Howdie!" viene passato a puts .

La linea di codice

puts man.noise

Usa il metodo getter e non funzionerebbe se si rimuove il metodo getter.


Sicuramente entrambi restituiscono un valore, ma il loro comportamento è diverso.

Diciamo che c'è già un membro @a .

con getter, si ottiene il valore corrente di @a , senza modificarlo.

con setter, si modifica @a e si ottiene il nuovo valore come valore di ritorno.

quando pensi al comportamento del setter, nota:

  1. il vecchio valore di @a non può essere ottenuto con setter e viene sovrascritto.

  2. ciò che è stato restituito dal setter, è già noto prima di invocare setter.





ruby