Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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を使ってやればいいのでは疑惑が出たので記事執筆中