2016-10-02 2 views
0

ich einige Buchstaben von einem Wort zu extrahieren und die Buchstaben durch ihr chemisches Symbol ersetzen.Wie ersetzen Buchstaben in einem String mit einem Hash-Wert

Dies funktioniert, aber es ist toooo lang. Ich bin sicher, es gibt eine Möglichkeit, es kürzer zu machen:

puts "Enter your name" 
name = gets.chomp 

if name.include? 'br' 
    name.gsub!('br', 'Br') 
end 
if name.include? 'ba' 
    name.gsub!('ba', 'Ba') 
end 
if name.include? 'cr' 
    name.gsub!('cr', 'Cr') 
end 

if name.include? 'ac' 
    name.gsub!('ac', 'Ac') 
end 

if name.include? 'al' 
    name.gsub!('al', 'Al') 
end 

if name.include? 'am' 
    name.gsub!('am', 'Am') 
end 

Ich versuche, dies zu tun, aber es funktioniert nicht. Was ist falsch?

puts "Enter your name" 
name = gets.chomp 

    symbols = { 
    :ac => "Ac", 
    :al => "Al", 
    :am => "Am", 
    :br => "Br", 
    :ba => "Ba", 
    :cr => "Cr" 
    } 


if name.include? symbols 
    symbols.each{ |key, value| name.gsub!(key, value) } 
end 

puts name 

bekomme ich folgende Fehlermeldung:

breakingbad.rb:15:in `include?': no implicit conversion of Hash into String (TypeError) 
     from breakingbad.rb:15:in `<main>' 

Antwort

3

Verwenden String als Raute-Taste. String#gsub akzeptiert auch einen Hash als zweites Argument. !

If the second argument is a Hash, and the matched text is one of its keys, the corresponding value is the replacement string.

symbols = { 
    'ac' => "Ac", 
    'al' => "Al", 
    'am' => "Al", 
    'br' => "Br", 
    'ba' => "Ba", 
    'cr' => "Cr" 
} 
puts "Enter your name" 
name = gets.chomp 
name.gsub!(/#{symbols.keys.join('|')}/, symbols) 
puts name 
+0

, die perfekt aber ich funktioniert nicht wirklich verstehen, diese Zeile 'name.gsub (/ # {symbols.keys.join ('|')} /, Symbole)' können Sie erklären, es ein bisschen bitte? –

+2

, dass ein regulärer Ausdruck ist, äquivalent zu '/ (ac | al | am | br | ba | cr) /'. Ihr Code sollte auch funktionieren, wenn Sie 'to_s' auf dem Symbol aufrufen. 'symbols.each {| Schlüssel, Wert | name.gsub! (key.to_s, Wert)} '. Auch 'wenn name.include? Symbole "ist falsch. include-Methode erwartet ein String-Argument. – Santhosh

+0

alles in Ordnung! Dank viel :) –

Verwandte Themen