/ / Objasnenie metódy triedy Ruby - rubín, attr-accessor

Objasnenie metódy triedy Ruby - ruby, attr-accessor

Našiel som túto triedu z knihy Eloquent Ruby.

class TextCompressor
attr_reader :unique, :index
def initialize( text )
@unique = []
@index = []
words = text.split
words.each do |word|
i = @unique.index( word )
if i
@index << i
else
@unique << word
@index << unique.size - 1
end
end
end
end

Funguje to takto:

text = "This specification is the spec for a specification"
compressor = TextCompressor.new(text)
compressor.unique #=> ["This", "specification", "is", "the", "spec", "for", "a"]
compressor.index #=> [0, 1, 2, 3, 4, 5, 6, 1]
  1. Čo je unique v @index << unique.size - 1, a odkiaľ má svoju hodnotu?
  2. compressor.unique a compressor.index prichádzajúce z attr_reader :unique, :index, alebo @unique a @index?

odpovede:

4 pre odpoveď č. 1
  1. V kontexte. \ T initialize metóda unique je rovnaká ako self.unique a self tu je inštanciovaný objekt (TextCompressor.new)

self.unique v tomto prípade vám vráti hodnotu @unique premenlivý

  1. Dôvod, prečo môžete zavolať compressor.unique a compressor.index pochádza z attr_reader :unique, :index. Tento riadok nastavuje gettery za vás (getter je metóda dotazovania objektu napríklad na hodnotu premennej).

1 pre odpoveď č. 2

Na @unique a @index sú premenné súkromnej inštancie. V triede im vždy predchádzate znakom @. Mimo triedy sú úplne nedostupné[1]. attr_reader je funkcia metaprogramovania v Ruby, ktorá vytvára getter. Nasledujúce sú ekvivalentné.

attr_reader :unique, :index

a

def unique
@unique
end

def index
@index
end

Metódy definované attr_reader a spol sú verejné, a preto k nim možno pristupovať mimo triedy pomocou object_name.unique syntax. Rovnako ako v mnohých jazykoch je možné k nim pristupovať aj nekvalifikovane v rámci triedy, takže ak ste v rámci triedy, unique a self.unique sa vyhodnotí na rovnakú vec (za predpokladu, že neexistuje lokálna premenná s názvom unique v rozsahu). Takže tvoja unique.size call je vlastne volanie dvoch metód. V Jave by to vyzeralo getUnique().getSize(), ale Ruby nás v mnohých prípadoch necháva vynechať zátvorky.

Dôležitá vec, ktorú si treba o Ruby zapamätať, je vo všeobecnosti, ak áno a.b alebo a.b = c, vy ste vždy volanie metódy. Premenné inštancie Ruby (veci začínajúce na @) sú vždy súkromné, takže neexistuje žiadny spôsob, ako k nim priamo pristupovať mimo triedy foo.bar syntax na prístup k premennej verejnej inštancie, ako napríklad v jazyku Java alebo C++. foo.bar je vždy metóda; môže sa stať, že ide o metódu, ktorá pristupuje a vracia hodnotu @bar.

To je viac v súlade s názorom SmalltalkOOP, kde si voľne spojené objekty odovzdávajú správy za účelom výmeny informácií. V takomto modeli nemá zmysel mať priamy prístup k údajom niekoho iného; všetko, čo môžete urobiť, je požiadať o to a čakať na odpoveď.


[1] Ignorovanie odrazových prvkov, ktoré môžu takéto pravidlá obísť.