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]
- Čo je
unique
v@index << unique.size - 1
, a odkiaľ má svoju hodnotu? - sú
compressor.unique
acompressor.index
prichádzajúce zattr_reader :unique, :index
, alebo@unique
a@index
?
odpovede:
4 pre odpoveď č. 1- V kontexte. \ T
initialize
metódaunique
je rovnaká akoself.unique
aself
tu je inštanciovaný objekt (TextCompressor.new
)
self.unique
v tomto prípade vám vráti hodnotu @unique
premenlivý
- Dôvod, prečo môžete zavolať
compressor.unique
acompressor.index
pochádza zattr_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ť.