Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

N文字目だけ破壊的に大文字へ変更する

N文字目だけ文字を変更する場合には、String#[]とObject#instance_evalが使えます。

例えば行頭だけ変えたい場合はこうします。

"hoge".instance_eval {|i| p i[0].upcase + i[1..-1]}
#=>"Hoge"

みんな大好きactive_supportを使うと、もう少し綺麗にかけます

require "active_support/core_ext"

"hoge".instance_eval {|i| i.first.upcase + i.from(1) }
#=>"Hoge"

単に先頭だけなら

require "active_support/core_ext"

'hoge'.humanize
#=> "Hoge"

という手もあります。

末尾なら、

"hoge".instance_eval {|i| i[0..-2] + i[-1].upcase}
#=> "hogE"

あるいは

require "active_support/core_ext"

"hoge".instance_eval {|i| i.to(-2) + i.last.upcase}
=> "hogE"

これがN番目となると、
配列にしてぐるぐる回す方法か

"hogefugapiyo".split("").each_with_index{|i,j| i.upcase! if j == 3}.join("")
#=> "hogEfugapiyo"

場所と前後を泥臭く指定する方法くらいしか考えつきません(白目

"hogehugapiyo".instance_eval {|o| o[0..2] + o[3].upcase + o[4..-1] }
=> "hogEhugapiyo"

#=> 10/12追記: 単にformatを使ってやればいいのでは疑惑が出たので記事執筆中