2014-04-16 109 views
0

我想基於散列來轉換字符串。例如,當散列包含"assistant"=>"asst""director"=>"dir"時,字符串"assistant director"被轉換爲"asst dir"。我想要做的事,如:修改基於散列的字符串

hash = Hash["executive"=>"exec","assistant"=>"asst","associate"=>"assoc","director"=>"dir"] 
str = "assistant director" 

hash.each { |k, v| str.gsub!(k, v) } 
# => "asst dir" 

基於this post

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

應該是答案。但它不會返回轉換後的字符串。 str也沒有改變。

+0

@BroiSatse final_str不會返回任何東西 – echan00

回答

2

hash.each { |k, v| str.gsub!(k, v) }將返回hash.to_a,但它並不重要,因爲您正在使用gsub!這意味着您的str已更改。簡單地做:

hash.each { |k, v| str.gsub!(k, v) } 
str  #=> "asst dir" 
+0

擊敗我,完全正確。 –

+0

@BroiSatse很奇怪,所以如果str =「Director」,那麼hash.each {| k,v | str.downcase.gsub!(k,v)}不起作用? – echan00

+1

@ echan00 - 這並不奇怪,'gsub!'修改給定的字符串實例。另一方面''downcase'創建一個新的字符串實例,所以你的'gsub!'修改那個實例,而不是你原來的字符串。在迭代之前調用'str.downcase!'應該足以解決它。 (注意砰 - 弦將再次被修改。 – BroiSatse

4

這樣做的另一種方法是: -

str.gsub!(/\w+/, hash) 

String#gsub!

如果第二個參數是一個Hash,而匹配的文本是它的關鍵之一,相應的值是替換字符串。