Stručné vysvetlenie nil v. empty v. blank v Ruby on Rails

Opakovane sa stretávam s tým, že hľadám jasnú definíciu rozdielov medzi pojmami nil?, blank? a empty? v Ruby on Rails. Tu je najbližšie k tomu, čo som našiel:

  • Objekty blank? sú false, prázdne alebo reťazec bielych znakov. Napríklad "", " ", nil, [] a {} sú prázdne.

  • Objekty nil? sú inštancie triedy NilClass.

  • Objekty empty? sú špecifické pre jednotlivé triedy a ich definícia sa líši od triedy k triede. Reťazec je prázdny, ak neobsahuje žiadne znaky, a pole je prázdne, ak neobsahuje žiadne položky.

Chýba tu niečo, alebo je možné urobiť presnejšie porovnanie?

Riešenie

.nil? možno použiť na ľubovoľný objekt a je true, ak je objekt nil.

.empty? možno použiť na reťazce, polia a hashe a vráti true, ak:

  • String length == 0
  • dĺžka poľa == 0
  • Dĺžka poľa == 0

Spustenie príkazu .empty? na niečo, čo je nil, vyhodí chybu NoMethodError.

Tu prichádza na rad .empty?. Je implementovaný v systéme Rails a bude fungovať na ľubovoľnom objekte, ako aj pracovať ako .empty? na reťazcoch, poliach a hash.

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

.blank? vyhodnocuje true aj na reťazcoch, ktoré nie sú prázdne, ale obsahujú iba biele znaky:

"  ".blank? == true
"  ".empty? == false

Rails tiež poskytuje .present?, ktorý vracia negáciu .blank?.

Zádrheľ v poli: blank? vráti false, aj keď sú všetky elementy poľa prázdne. Ak chcete v tomto prípade určiť prázdnotu, použite napríklad all? s blank?:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
Komentáre (12)

Jedným z rozdielov je, že .nil? a .empty? sú metódy, ktoré poskytuje programovací jazyk Ruby, zatiaľ čo .blank? je niečo pridané, čo poskytuje webový vývojový framework Rails.

Komentáre (0)

Nezabudnite na any?, čo je všeobecne !empty?. V Rails zvyčajne kontrolujem prítomnosť niečoho na konci príkazu pomocou if something alebo unless something a potom používam blank?, kde je to potrebné, pretože sa zdá, že to funguje všade.

Komentáre (2)