web-dev-qa-db-ja.com

文字列内の文字を置き換える方法

文字列の文字を置き換えるために使用したいメソッドがあります:

def complexity_level_two
  replacements = {
      'i' => 'eye', 'e' => 'eei',
      'a' => 'aya', 'o' => 'oha'}
  Word = "Cocoa!55"
  Word_arr = Word.split('')
  results = []
  Word_arr.each { |char|
    if replacements[char] != nil
      results.Push(char.to_s.gsub!(replacements[char]))
    else
      results.Push(char)
    end
  }
end

文字列の私の望ましい出力は次のようになります:Cohacohaa!55

ただし、このメソッドを実行すると、文字は置き換えられず、文字列のみが出力されます。

C
o
c
o
a
!
5
5

このメソッドが文字列内の正しい文字を置き換えてhashの文字と一致しない箇所で何が問題になっていますか?これを修正して目的の出力を得るにはどうすればよいですか?

8
User9123
replacements = {
  'i' => 'eye', 'e' => 'eei',
  'a' => 'aya', 'o' => 'oha'}
Word = "Cocoa!55"
Word.gsub(Regexp.union(replacements.keys), replacements)
#⇒ "Cohacohaaya!55"

Regexp::unionString#gsub with hash

17

これを試すことができます:

my_subs = { 'i' => 'eye', 'e' => 'eei','a' => 'aya', 'o' => 'oha' }
my_Word = "Cocoa!55"
my_Word.split('').map{|i| my_subs[i] || i}.join

=>「Cohacohaaya!55」

1
IDIR GACI
replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha' }.
  tap { |h| h.default_proc = ->(h,k) { k } }

"Cocoa!55".gsub(/./, replacements)
  #=> "Cohacohaaya!55"

Hash#default_proc = および Object#tap を参照してください。

gsubは、文字列の各文字を調べます。 replacementsがその文字をキーとして持つ場合、その文字はreplacements内のそのキーの値に置き換えられます。それ以外の場合(デフォルトのプロシージャのため)、文字はそれ自体に置き換えられます(つまり、変更されません)。

別の方法は Hash#fetch を使用することです:

replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha' }

"Cocoa!55".gsub(/./) { |s| replacements.fetch(s) { |c| c } }
  #=> "Cohacohaaya!55"

Ruby v2.2 +( Object#itself がデビューしたとき)の場合)

"Cocoa!55".gsub(/./) { |s| replacements.fetch(s, &:itself) }
1
Cary Swoveland

メソッドの作成

Wordおよびsubsパラメータを使用してメソッドを定義します。

def char_replacer Word, subs
  Word.chars.map { |c| subs.key?(c) ? subs[c] : c }.join
end

ここでは、本質的にはよりコンパクトな形式のif-else式である三項演算子を使用しました。注意すべき主要なメソッドはString#charsArray#mapHash#key?、これらの詳細については Ruby-docs を参照してください。これですべてが設定されたので、Word文字列と選択したsubsハッシュを渡してメソッドを呼び出すことができます。

例1

my_subs = { 'i' => 'eye', 'e' => 'eei','a' => 'aya', 'o' => 'oha' }
my_Word = "Cocoa!55"

char_replacer my_Word, my_subs #=> "Cohacohaaya!55"

例2

my_subs = { 'a' => 'p', 'e' => 'c' }
my_Word = "Cocoa!55"

char_replacer my_Word, my_subs #=> "Cocop!55"
1
Sagar Pandya