2017-01-20 3 views
0

Je compte longueur de la chaîne comme indiqué ci-dessous:Compter en caractères Ruby 1.9.3 erreur

if(key['name'].to_s.chars.length==0) 
    key['name']="Others" 
end 

Et rubis 2.1.8p440 cela fonctionne, mais Ruby 1.9.3p551 il jette l'erreur suivante:

(undefined method `length' for #<Enumerator: "Latency":chars>): 

Je ne peux pas mettre à jour 1.9.3 Je dois changer ce code.

Répondre

5

Quel est le problème avec plus explicite:

key['name'] = "Others" if key['name'].to_s.empty? 

qui fonctionne partout?


BTW, en Ruby 1.9.3 il n'y a pas Enumerable#length il y a Enumerable#count. L'alias length il a reçu plus tard.

+0

Le '.to_s' est susceptible de gérer nils. Dans ce cas, il peut être encore plus court, 'si la clé ['nom']. Blank?' –

+0

@SergioTulentsev je parie pour les symboles. – mudasobwa

+0

travaille pour eux aussi :) –

2

Dans Ruby 1.9.3 String#chars

Passes each character in str to the given block, or returns an enumerator if no block is given.

donc convertir en un tableau avant d'appeler length devrait résoudre le problème:

key['name'].to_s.chars.to_a.count == 0 # or size ? 
+0

Hm, même erreur ... –

+0

'count' devrait fonctionner. – mudasobwa

+0

@mudasobwa thx! –

0

essayez key['name'].to_s.mb_chars.length. J'espère que cela vous aidera.

0

Votre question est identifiée avec ruby-on-rails qui a les méthodes blank? et presence. Avec des méthodes que je voulais écrire quelque chose comme:

if key['name'].blank? 
    key['name'] = 'Others' 
end 

Ou:

key['name'] = 'Others' if key['name'].blank? 

Ou:

key['name'] = key['name'].presence || 'Others' 
+0

Le dernier se sent bizarre à mon humble avis. –

+0

@EricDuminil Le dernier est presque le même que les exemples dans les docs de Rails. IMHO un exemple parfait pourquoi la méthode 'présence' a été introduite. – spickermann

+0

Je n'aime pas remplacer une valeur par elle-même quand ce n'est pas nécessaire. Le deuxième exemple (le meilleur à mon humble avis) ne touche pas 'key ['name']' lorsqu'il est déjà défini. –