Mám hash, povedzme:
ahash = {test1: "test1", test2: "test2"}
Prečo je to tak? Hash === ahash
vráti pravdu, ale ahash === Hash
nie je to nejaké predvolené rubínové správanie s === a názvom triedy?
odpovede:
17 pre odpoveď č. 1Je to tak ako ===
metóda funguje. Je to smerové a platí pre každú triedu:
"foo" === String
# => false
String === "foo"
# => true
Je to preto, že sa hodnotí na:
"foo".send(:===, String)
String.send(:===, "foo")
To sú dve rôzne metódy, jedna pre triedy, jedna pre inštanciu.
Ak sa zaujímate iba o informácie o triede:
"foo".is_a?(String)
# => true
{ }.is_a?(Hash)
# => true
Táto metóda umožňuje oveľa jasnejšie, aký je váš zámer.
6 pre odpoveď č. 2
Nevykonáte testovanie, čo si myslíte, že ste testovaní
Module # === (nazývaný tiež "operátor rovnosti prípadov") vracia true, ak je objekt na pravej strane výrazu inštanciou ľavej strany alebo jedného z jej potomkov. Keď sa spýtate:
Hash === {test1: "test1", test2: "test2"}
čo sa naozaj pýtate, je toto: "Je tento hash doslova príkladom alebo potomkom Hashovej triedy?" Na druhej strane, opak je nepravdivý, pretože hašiš trieda nie je inštanciou alebo potomkom vášho literárneho hash.
Viac informácií o rovnosti prípadov
Na druhej strane tieto práce fungujú buď:
Hash.new === {}
{} === Hash.new
pretože obidva výrazy sú ekvivalentné prípadu. Tu je rovnaký výsledok s použitím vašich údajov:
Hash[:test1, "test1", :test2, "test2"] === {:test1=>"test1", :test2=>"test2"}
#=> true
{:test1=>"test1", :test2=>"test2"} === Hash[:test1, "test1", :test2, "test2"]
#=> true
Triquals však nie je len "stand-in" Predmet # is_a?, Je to naozaj určené na to, aby bol spotrebovaný prípadom / keď vyhlásenia, a Hovorí Giles Bowkett:
Existuje metóda === pre kontrolu toho, ako prípad / kedy blok vyhodnotí objekt. Nikdy by ho nemali používať ľudia. Je to kód napísaný na to, aby bol spotrebovaný iným kódom, konkrétne podľa prípadu a kedy.