こんにちは。Tomoyuki(@tomoyuki65)です。
みなさん、文字列オブジェクトのメソッドを使ったことはありますか?
文字列オブジェクトのメソッドを使うと、文字列に対して様々な処理をすることができるんです!
※ただし、Ruby特有の破壊的なメソッドもあるので注意が必要です。
この記事では、文字列操作について解説します。
文字列操作
upcaseメソッド
では実際に文字列操作を行ってみましょう。
まずは例として、文字列中の小文字を大文字にするメソッド「upcase」を使ってみます。
以下のプログラムを実行してみて下さい。
# upcaseメソッド
str = "tanaka"
p str.upcase # pメソッドはデバッグ出力用(データ形式がわかるため便利です)
p str
“tanaka”
実行結果の通り、upcaseメソッドにより「str.upcase」では大文字に変換されて出力されました。
※今回はpメソッドを使っているため、「”」も含めて出力されています。
include?メソッド、lengthメソッド
次はinclude?メソッドとlengthメソッドを使ってみましょう。
include?メソッドは、文字列中に特定の文字列が存在した場合に真偽値の「true」を返します。
そしてlengthメソッドは、文字列のバイト数を返します。
では以下のプログラムを実行してみて下さい。
# 文字列中に「東京」が存在するかをチェックし、存在したら「true」を返す
p "今日は東京でラーメンを食べたよ!".include?("東京")
p "今日は札幌でラーメンを食べたよ!".include?("東京")
# 文字列の文字数を返すメソッド
p "Hello World!".length
false
12
実行結果の通り、メソッドの使い方を覚えることで文字列に対して様々な処理ができます。
メソッドは沢山あるので、必要なものから覚えましょう。
尚、今回「include?」のように「?」がついたメソッドを使いました。
これは、真偽値を返すメソッドで条件判定などに使われます。
条件が真(成り立つ)の時は「true」、偽の時は「false」を返します。
破壊的メソッドとは?
Rubyには「!」の付くメソッドが存在します。
この「!」が付くメソッドを「破壊的メソッド」と呼び、使い方には注意が必要です。
例として、上記で出てきたupcaseメソッドにも破壊的メソッドが存在するので使ってみましょう。
では以下のプログラムを実行してみて下さい。
# 各変数に値を代入
str = "tanaka"
str2 = str
# 各変数を出力
p str
p str2
# upcase!メソッド
p str.upcase!
# 各変数を出力
p str
p str2
“tanaka”
“TANAKA”
“TANAKA”
“TANAKA”
実行結果の通り、「upcase!」メソッド実行後に、変数の「str」と「str2」の値も上書きされてしまいました。
このように、破壊的メソッドは元のオブジェクトを書き換えてしまうので、使用する際には注意が必要です。
特に変数「str」を代入した「str2」も上書きされてしまっている点には注意しなければなりません。
これは【Ruby入門】変数とは?変数名の付け方やスコープについて【#2】で説明した通り、「変数はラベルのようなもの」という表現に表れています。
破壊的メソッドのイメージ
通常の場合と破壊的メソッドの場合の違いについて、図を参考に解説します。
まずは以下の図1をご覧下さい。
図1:代入のイメージ
まず、図の左側にある変数「str」と「str2」は同じ文字列オブジェクト「”tanaka”」のラベルです。
その後、変数「str」に文字列「”TANAKA”」を代入した場合、「str」と「str2」は別々のオブジェクトのラベルとなります。
次に以下の図2をご覧下さい。
図2:破壊的メソッドのイメージ
図1と同様に変数「str」と「str2」は同じ文字列オブジェクト「”tanaka”」のラベルです。
ただし、「str.upcase!」メソッド実行後は、ラベル元のオブジェクトが「”TANAKA”」で上書きされます。
このように、元のオブジェクトを変えてしまうメソッドを破壊的メソッドと呼びます。
今回は「!」が付いているメソッドについて説明しましたが、「!」が付いていないメソッドにも同様の動作をするものがありますので注意して下さい。
%記法
これまで学んだ文字列の書き方は、「”」または「’」で囲う方法でした。
しかし、他の便利な方法として「%記法」というものがあります。
%記法では、「”」の代わりに「%Q{}」または「%{}」(Qは省略可能)、「’」の代わりに「%q{}」を使うことができます。
では以下のプログラムを実行してみて下さい。
# 「"」または「'」の場合
puts "みかん2個で#{100 * 2}円"
puts 'みかん2個で#{100 * 2}円'
# 「"」で囲うのと同等
puts %Q{みかん2個で#{100 * 2}円}
# Qは省略可能
puts %{みかん2個で#{100 * 2}円}
# 「'」で囲うのと同等
puts %q{みかん2個で#{100 * 2}円}
みかん2個で#{100 * 2}円
みかん2個で200円
みかん2個で200円
みかん2個で#{100 * 2}円
実行結果の通り、「”」や「’」で囲ったのと同様に文字列が出力されました。
確かに文字列が出力されましたが、何が便利なのでしょうか?
それは、文字列の中で「”」や「’」を使いたい場合に、%記法であれば「\」(バックスラッシュ)を記載する必要がありません。
では以下のプログラムを実行してみて下さい。
# 「"」または「'」の場合、「\」が必要
puts "Hello\"World"
puts 'Hello\'World'
# %記法の場合
puts %{Hello"World}
puts %q{Hello'World}
Hello’World
Hello”World
Hello’World
書式付き文字列
文字列には、書式付きで値を埋め込むことができます。
書き方は「”文字列” % 値」とし、値の種類に応じて文字列の中に特殊な記号を使用します。
例えば、値が文字列の場合は「%s」、整数の場合は「%d」、浮動小数点数の場合は「%f」を使用します。
では以下のプログラムを実行してみて下さい。
# 文字列を埋め込む場合
p "name:%s" % "Tanaka"
# 10桁分の幅を確保して文字列を埋め込む
p "name:%10s" % "Tanaka"
# 10桁分の幅を確保して左寄せ
p "name:%-10s" % "Tanaka"
# 整数と浮動小数点数を埋め込む場合
p "num:%d, rate: %f" % [10, 0.10]
# 整数が4桁、満たない場合は0埋め
# 浮動小数点数で小数点の前が5桁、小数点以下が2桁
p "num:%04d, rate: %5.2f" % [10, 0.10]
“name: Tanaka”
“name:Tanaka ”
“num:10, rate: 0.100000”
“num:0010, rate: 0.10”
実行結果の通り、文字列の中に値を埋め込むことができます。
また、これらは書式を指定して出力する「printf」や「sprintf」メソッドでも使用できます。
では以下のプログラムを実行してみて下さい。
# printfを使用(わかりやすいよう改行を付与)
printf("name:%10s\n", "Tanaka")
printf("num:%04d, rate: %5.2f\n", 10, 0.10)
# sprintfを使用(文字列を返すメソッドのため、pメソッドも使用)
p sprintf("name:%10s\n", "Tanaka")
p sprintf("num:%04d, rate: %5.2f\n", 10, 0.10)
num:0010, rate: 0.10
“name: Tanaka\n”
“num:0010, rate: 0.10\n”
まとめ
- 文字列はメソッドにより様々な処理をさせることができる(文字列操作)
- 「upcase」メソッドは、文字列中の小文字を大文字に変換する
- 「include?」メソッドは、文字列中に特定の文字列が存在するかを判定し、真偽値を返す
- 「length」メソッドは、文字列のバイト数を返す
- 「?」付きのメソッドが真偽値を返すメソッドで、条件が真(成り立つ)の時は「true」、偽の時は「false」を返す
- 元のオブジェクトを変えてしまうメソッドを破壊的メソッドと呼ぶ
- 「!」付きのメソッドが破壊的メソッドだが、「!」が付いていないものも存在する
- %記法の書き方は、「”」の代わりに「%Q{}」または「%{}」(Qは省略可能)、「’」の代わりに「%q{}」を使う
- 文字列には書式付きで値を埋め込むことができ、書き方は「”文字列” % 値」である
- 書式付きで値を埋め込む場合、値が文字列の場合は「%s」、整数の場合は「%d」、浮動小数点数の場合は「%f」を使用する
- 関連記事
Tomoyuki
最新記事 by Tomoyuki (全て見る)
- Go言語(Golang)専門の技術ブログ「Golang-Tech」を開設!? - 2024年9月26日
- 【2024年】モンハンワイルズの推奨スペックとおすすめのゲーミングPCを紹介! - 2024年9月26日
- 37歳Web系エンジニア3年目。生成AI(ChatGPT・Gemini)現る。 - 2024年7月3日
コメントを残す