12
votes

Comment remplacez-vous une chaîne avec une valeur de collecte de hachage dans Ruby?

J'ai une collection de hash: my_hash = {"1" => "Apple", "2" => "abeille", "3" => "CAT"}

Quelle syntaxe serai-je utiliser pour remplacer la première occurrence de la clé avec la collecte de hachage valeur dans une chaîne?

Par exemple, ma chaîne d'entrée: str = je veux un 3

La chaîne résultante serait: str = je veux un chat


4 commentaires

Quelles sont les hypothèses sur la chaîne d'entrée? Généralement, des langages de modèle comme celui-ci marquent d'une manière ou d'une autre, comme str = je veux un {3} (formatage de chaîne .NET).


Le débordement de la pile n'est pas "Veuillez coder cela pour moi"; Quel est votre code jusqu'à présent? Quelles sont vos questions?


... Apparemment je me trompe. Comme en témoigne ci-dessous, nous sommes tous aussi désespérés d'aider à remettre le code à de nouveaux utilisateurs. Bienvenue dans le débordement de la pile! ;)


J'utiliserais la fonctionnalité de modèles de chaîne intégrée de Ruby 2.0 si possible. Compte tenu d'un hachage avec des touches de symboles, H = {PET: "CAT"} Vous pouvez le faire: "Je veux un% {animal}"% h # => "Je veux un chat "


8 Réponses :


0
votes

1 commentaires

@Oleksi Vous voulez dire hash pas hachage [clé] ie my_hash = {"1" => "Apple", "2" => "abeille", "3" = > "cat"} my_str = 'je veux un 3' met mon_str.sub ('3', my_hash) # => 'Je veux un chat'



3
votes

Je n'ai pas compris votre problème, mais vous pouvez essayer ceci: xxx

: d


2 commentaires

IMHO C'est un peu surchargé.


Heh, j'aime celui-ci pour tourner la tête à l'envers. (J'avais +1 vous, mais je suis dehors pour la journée.;)



19
votes

Ma doublure: xxx pré>

ou en utilisant string # SUB! code> Méthode: p>

hash.each { |k, v| str.sub!(k, v) }


4 commentaires

+1 (quand j'obtiens les votes) pour l'utilisation de chaîne # [] = et & = .


Quelqu'un peut-il expliquer ce qu'est la première doublure?


Comme les opérateurs booléens de Ruby sont courts-circuits, le deuxième argument est évalué si et seulement si le premier est vrai. La chaîne # [] si elle a donné la chaîne, il le trouve et renvoie la référence sous-chaîne. Donc, si nous vous attribuons quelque chose, nous allons changer une partie de la chaîne. Enfin, nous le rejoignons ensemble et si la sous-chaîne est trouvée dans la chaîne, puis remplacez-la avec la valeur de hachage.


Lukasz, beau travail. Une correction: vous devez utiliser le 'SUB!' méthode plutôt que la méthode «sous» pour que votre deuxième exemple fonctionne. 'sous!' modifie la chaîne en place. (Ou utilisez 'gsub!' Pour remplacer toutes les occurrences de la correspondance dans la chaîne.)



3
votes

Juste pour ajouter du point de style libre Abuse à la réponse de FL00R:

my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}
my_hash.default_proc = Proc.new {|hash, key| key}
str = "I want a 3"
str.gsub(/[[:word:]]+/).each(&my_hash.method(:[]))


0 commentaires

2
votes
str.sub /[0-9]+/, my_hash

0 commentaires

4
votes

Assumant Ruby 1.9 ou version ultérieure:

str.gsub /\d/, my_hash


0 commentaires

14
votes
"I want a %{b}" % {c: "apple", b: "bee", a: "cat"}
=> "I want a bee"

0 commentaires

0
votes

Le code suivant Remplacez la première occurrence de la touche avec la collection de la valeur dans la chaîne donnée str xxx


2 commentaires

Cela améliorerait la qualité de votre réponse si vous pouviez fournir davantage une explication de votre code. Pourquoi quelqu'un devrait-il essayer votre code, existe-t-il quelque chose qui peut les aider à comprendre ce qu'ils doivent faire?


Explication ajoutée