2016-10-02 15 views
0

単語からいくつかの文字を抽出し、化学記号で置き換えたいと思います。文字列内の文字をハッシュ値に置き換える方法

これはうまくいきますが、長すぎます。

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 

私はこのようにしようとしていますが、動作しません。なにが問題ですか?

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

答えて

3

使用文字列のハッシュキーとして:

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 

は、私は次のエラーを取得します。 String#gsubは、第2引数としてハッシュも受け入れます。 !完璧に動作しますが、私は本当に `name.gsubこの行を理解していない

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

(/#{ '|' symbols.keys.join()} /、記号)' あなたが説明することができますそれは少ししてください? –

+2

これは '/(ac | al | am | br | ba | cr)/'と同じ正規表現です。シンボルに対して 'to_s'をコールすると、あなたのコードも動作するはずです。 'symbols.each {| key、value | name.gsub(key.to_s、value)} '。また、 'name.include?記号は間違っています。インクルードメソッドはString引数を必要とします。 – Santhosh

+0

大丈夫です!ありがとうございます:) –

関連する問題