/ / Ruby: Prečo Hash === {} vráti pravdivú? - rubín

Ruby: Prečo je Hash === {} pravdivá? - rubín

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ď č. 1

Je 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.