2010-05-02 4 views
1

Je travaille avec ruby 1.8.6 (2007-03-13 patchlevel 0) [x86_64-linux] et je reçoisméthode non définie « octets » pour pour cordes en Ruby

undefined method `bytes' for #<String:0x2a95ec2268> (NoMethodError) 

même si mon code fonctionne sur Ruby 1.8.7. patchlevel 249 J'ai vu quelque part que vous devez ajouter require "jcode" pour une méthode similaire erreur non définie avec each_byte. J'ai essayé d'ajouter cela mais ça ne marche toujours pas. Toutes les suggestions sont très appréciées.

Répondre

2

Ruby 1.8.6 n'a pas String#bytes. C'est un ajout de 1,9 qui a été rétroporté à 1.8.7.

Vous pouvez la mettre en œuvre à peu près vous comme ceci:

class String 
    require 'enumerator' 

    def bytes(&block) 
    return to_enum(:each_byte) unless block_given? 
    each_byte &block 
    end 
end unless ''.respond_to?(:bytes) 

[Note:. Je ne l'ai pas vérifié si cela répond en fait le contrat de String#bytes 100%, mais il est assez proche pour mon usage]

+0

Merci pour votre réponse. J'ai remarqué quelque chose d'intéressant cependant. Quand je lance 'mystr.bytes.inject {| x, y | (x << 8) | y} 'J'obtiens un fixnum, mais quand je cours avec le code, j'obtiens un objet string. – artsince

+0

@artsince: Oui, désolé. Copier et coller l'erreur. Je l'ai corrigé. –

3

Dans Ruby 1.8.6, vous pouvez utiliser mon backports bijou:

require 'backports/1.8.7/string/bytes' 

Ta-da, vous avez maintenant accès à String#bytes.

Vous avez également tous les many other changes introduits en 1.8.7. Et la plupart de 1.9.1, et tous les prochains 1.9.2, etc ...

+0

Je ne reçois pas un tel fichier pour charger l'erreur lorsque j'ajoute cette déclaration. – artsince

+0

Vous aurez besoin de l'installer, comme d'autres gemmes, avec 'sudo install backports' –

+0

Je vois, je ne pourrais pas être en mesure de le faire comme je suis en train d'exécuter un travail cron sur mon compte d'hébergement payant – artsince

Questions connexes