2009-10-22 5 views
3

Fondamentalement ce que dit la question. Comment puis-je supprimer un caractère à une position d'index donnée dans une chaîne? La classe String ne semble pas avoir de méthodes pour le faire.Supprimer un caractère à une position d'index dans Ruby

Si j'ai une chaîne « BONJOUR » Je veux que la sortie soit ce

["ELLO", "HLLO", "HELO", "HELO", "HELL"] 

Je le fais en utilisant

d = Array.new(c.length){|i| c.slice(0, i)+c.slice(i+1, c.length)} 

Je ne sais pas si vous utilisez tranche! travaillera ici, car il va modifier la chaîne d'origine, non?

Répondre

2
$ cat m.rb 
class String 
    def maulin! n 
    slice! n 
    self 
    end 
    def maulin n 
    dup.maulin! n 
    end 
end 
$ irb 
>> require 'm' 
=> true 
>> s = 'hello' 
=> "hello" 
>> s.maulin(2) 
=> "helo" 
>> s 
=> "hello" 
>> s.maulin!(1) 
=> "hllo" 
>> s 
=> "hllo" 
+0

Y at-il une grande différence entre 'self.class.new (self) .maulin! n' et 'self.dup.maulin! n'? –

+0

je suppose qu'il devrait juste être dup.maulin! n', bon point – DigitalRoss

9

Ne sera pas Str.slice! fais le? De ruby-doc.org:

str.slice (fixnum) => fixnum ou nul [...]

Deletes the specified portion from str, and returns the portion deleted. 
+2

retourne la valeur ASCII du caractère. Je veux ce qui reste de la chaîne à retourner. – Maulin

+2

Puis 'str.slice! (Fixnum); str'. – Chuck

1

Je l'ai fait quelque chose comme ça

c.slice(0, i)+c.slice(i+1, c.length) 

Où c est la chaîne et i est la position d'index que je veux supprimer. Y a-t-il un meilleur moyen?

+0

tranche! va modifier la chaîne en place. Alors appelez tranche! sur votre chaîne avec l'index du caractère que vous voulez supprimer. N'utilisez pas la valeur de retour. – JRL

4

Si vous utilisez Ruby 1.8, vous pouvez utiliser delete_at (mélangé dans Enumerable), sinon dans 1.9 vous pouvez utiliser slice !.

Exemple:

mystring = "hello" 
mystring.slice!(1) # mystring is now "hllo" 
# now do something with mystring 
0

Pour éviter d'avoir à patch singe String vous pouvez utiliser tap:

"abc".tap {|s| s.slice!(2) } 
=> "ab" 

Si vous devez laisser votre chaîne d'origine non modifiée, utiliser dup, par exemple. abc.dup.tap.

Questions connexes