ProcházímProgramování Ruby - pragmatický průvodce programátorya narazili na tento kus kódu:
class SongList
def [](key)
if key.kind_of?(Integer)
return @songs[key]
else
for i in [email protected]
return @songs[i] if key == @songs[i].name
end
end
return nil
end
end
Nechápu, jak funguje metoda []?
Proč je klíč mimo [], ale když je metoda volána, je uvnitř []?
Může být klíč bez závorek?
Uvědomuji si, že existují mnohem lepší způsoby, jak to napsat, a umím psát vlastní metodu, která funguje, ale tato [] metoda mě jen zmátla ... Jakákoli pomoc je velmi ceněna, díky
Všechny odpovědi
Metody v ruby, na rozdíl od mnoha jazyků, mohou obsahovat některé speciální znaky. Jedním z nich je syntaxe vyhledávání pole.
Pokud byste měli implementovat vlastní třídu hash, kde byste při načítání položky ve vašem hash chtěli obrátit, můžete provést následující:
Můžete to dokázat voláním hodnoty hash následujícím způsobem:
Def [] tedy definoval metodu, která se použije, když to uděláte
my_array["key"]
Jiné metody, které vám mohou připadat divné, jsou:Pouze pro objasnění, definice a
[]
metoda nesouvisí s poli nebo hashy. Vezměte si následující (nepřirozený) příklad:Je to jen syntaktický cukr. Existují určité vzory syntaxe, které se překládají do odesílání zpráv. Zejména
je stejné jako
a totéž platí pro
==
,!=
,<
,>
,<=
,>=
,<=>
,===
,&
,|
,*
,/
,-
,%
,**
,>>
,<<
,!==
,=~
a!~
také.Taky,
je stejné jako
a totéž platí pro
~
.Pak,
je stejné jako
a totéž platí pro
-
.Plus,
je stejné jako
K dispozici je také speciální syntaxe pro settery:
je stejné jako
A v neposlední řadě existuje speciální syntaxe pro indexování:
je stejné jako
a
je stejné jako
hranaté závorky jsou jako název metody
Array#size
ty mášArray#[]
jako metoda a můžete ji dokonce použít jako jakoukoli jinou metodu:poslední je něco jako syntaktický cukr a dělá přesně to samé jako první. The
Array#+
pracovat podobně:Můžete dokonce přidat tato čísla:
totéž funguje s
/
,*
,-
a mnoho dalších.Je to přetížitel operátoru, přepíše nebo doplní chování metody uvnitř třídy, kterou jste definovali, nebo třídy, jejíž chování upravujete. Můžete to udělat i jiným operátorům odlišným od []. V tomto případě upravujete chování [], když je voláno v jakékoli instanci třídy SongList.
Pokud máte songlist = SongList.new a pak uděláte songlist ["foobar"], pak bude fungovat vaše vlastní def a bude předpokládat, že "foobar" bude předán jako parametr (klíč) a bude to dělat "foobar" "cokoli, co metoda říká, by mělo být provedeno na klíč."
Snaž se
Leave a Reply