KAKUTA TECH BLOG

Blog Article

Rubyの基本的な文字列操作・条件分岐・メソッド定義について

はじめに

Rubyを学習する中でよく使う文字列の作成方法、条件分岐、メソッドの定義や命名規則についてまとめます。基本的な構文を確認しながら、それぞれの使いどころを整理していきます。

参考リンク

文字列を扱う

Rubyでは、シングルクォーテーションやダブルクォーテーションを使って文字列を作成する方法に加えて、% 記法やヒアドキュメントなど、用途に応じた複数の書き方があります。短い文字列であれば通常のクォーテーションで十分ですが、文字列の中にクォーテーションを含めたい場合や、複数行にわたる文章を扱いたい場合には別の記法が便利です。ここでは、%q、%Q、ヒアドキュメント、sprintf を使った文字列の作成方法を確認します。Ruby公式ドキュメントでも、文字列には複数のリテラル記法が用意されています。

% 記法で文字列を作成する

Rubyでは、%q や %Q を使って文字列を作成できます。%q はシングルクォーテーションで囲んだ文字列に近い扱いで、基本的に式展開を行いません。一方、%Q はダブルクォーテーションで囲んだ文字列に近く、#{} を使った式展開が利用できます。文字列の中にクォーテーションを多く含めたい場合など、通常のクォーテーションを何度もエスケープせずに記述できる点が便利です。

str1 = %q(シングルクォーテーションの文字列)
str2 = %Q(ダブルクォーテーションの文字列)

puts str1
#=> シングルクォーテーションの文字列

puts str2
#=> ダブルクォーテーションの文字列

%Q では式展開を利用できます。

name = "田中さん"
greeting = %Q(こんにちは、#{name}!)

puts greeting
#=> こんにちは、田中さん!

ヒアドキュメントで複数行の文字列を作成する

ヒアドキュメントは、複数行にわたる文字列を記述するときに使用できる構文です。<< の後ろに終了を示す識別子を指定し、その識別子が単独で現れる行までを文字列として扱います。長い文章や複数行のメッセージなどを扱う場合、通常のクォーテーションで改行を大量に記述するよりも読みやすくなります。また、通常のダブルクォーテーション文字列と同じように式展開も利用できます。

text = <<EOS
これは
複数行にわたる
文字列です。
EOS

puts text

変数を埋め込むこともできます。

name = "角田さん"

text = <<GREETING
こんにちは、#{name}!
お元気ですか?
またお会いできる日を楽しみにしています。
GREETING

puts text

終了識別子には EOS や GREETING など任意の名前を使用できます。重要なのは、開始時と終了時で同じ識別子を使用することです。

sprintf でフォーマットした文字列を作成する

sprintf を使用すると、指定したフォーマットに合わせて値を文字列へ埋め込むことができます。特に、小数点以下の桁数を指定したり、文字列や整数を決められた形式で組み立てたりするときに便利です。Rubyでは sprintf と format は同じ機能を提供するメソッドとして扱われます。単純な文字列の連結だけではなく、「どの形式で値を表示するか」を明確に指定したい場合に使用できます。

formatted = sprintf("%0.2f", 3.14159)

puts formatted
#=> 3.14

文字列と整数を組み合わせることもできます。

name = "田中さん"
age = 30

puts sprintf("名前: %s, 年齢: %d歳", name, age)
#=> 名前: 田中さん, 年齢: 30歳

%s は文字列、%d は整数をフォーマットするときに使用します。

真偽値と条件分岐

プログラムでは、ある条件を満たしているかどうかによって処理を分けることがよくあります。Rubyでは、true と false という真偽値を使い、if や case などの条件分岐と組み合わせます。また、複数の条件を組み合わせる場合には && や || を使用できます。条件が単純であれば if を使い、複数の候補から処理を選択する場合は case、短い条件分岐を式として書きたい場合は条件演算子を使うなど、状況に応じて使い分けることが重要です。

&& と || で条件を組み合わせる

Rubyでは、&& と || を使って複数の条件を組み合わせることができます。&& は両方の条件が成立する場合に全体として成立し、|| はどちらか一方の条件が成立すれば成立します。if の条件式では、この性質を利用して複数の条件をまとめて指定できます。ただし、Rubyの && や || は単純に true や false だけを返すものではなく、式の評価結果としてオペランドの値を返す点にも注意が必要です。

a = true
b = false

puts a && b
#=> false

puts a || b
#=> true

if と組み合わせると、次のように記述できます。

age = 25
citizen = true

if age >= 18 && citizen
  puts "条件を満たしています"
else
  puts "条件を満たしていません"
end

この例では、age >= 18 と citizen の両方が成立した場合に if の処理が実行されます。

case 文で複数の候補を分岐する

case 文は、ある値に応じて処理を分岐させたい場合に便利です。複数の if や elsif を使って同じ値を何度も比較するよりも、case と when を使ったほうが条件の候補が一覧として確認しやすくなる場合があります。特に、文字列や数値など、1つの値に対して複数の候補があるケースでよく使われます。最後に else を指定すれば、どの when にも一致しなかった場合の処理も記述できます。

fruit = "apple"

case fruit
when "apple"
  puts "りんごです"
when "banana"
  puts "バナナです"
else
  puts "不明な果物です"
end

成績のような値にも使用できます。

grade = "B"

case grade
when "A"
  puts "素晴らしい!"
when "B"
  puts "よくできました!"
when "C"
  puts "もう少し頑張りましょう。"
else
  puts "成績が不明です。"
end

条件演算子で簡単な条件分岐を書く

条件演算子は、条件によって2つの値のどちらを使うか決めたい場合に使用できます。Rubyでは 条件 ? 真の場合 : 偽の場合 という形式で記述します。if 文を数行使うほどではなく、条件に応じて変数へ値を代入したい場合などに便利です。ただし、条件を何重にも組み合わせると読みにくくなるため、複雑な条件分岐では通常の if や case を使ったほうが理解しやすくなります。

age = 20

message = age >= 18 ? "成人です" : "未成年です"

puts message
#=> 成人です

条件が複雑になった場合は、無理に1行へまとめず、if 文などに分けることを意識すると読みやすいコードになります。

メソッドを定義する

Rubyでは、何度も使用する処理をメソッドとしてまとめることができます。メソッドを定義すると、同じ処理を何度も書く必要がなくなり、処理に名前を付けることでコードの意味も分かりやすくなります。メソッドは def から始まり、メソッド名、必要な場合は引数、処理本体を記述し、end で定義を終了します。Rubyでは、メソッド内の最後に評価された式が、基本的にメソッドの戻り値になります。

基本的なメソッド定義

最も基本的なメソッドは、次のように定義できます。

def greeting
  "こんにちは!"
end

puts greeting
#=> こんにちは!

def greeting で greeting というメソッドを定義し、end までの処理がメソッドの本体になります。

引数を受け取るメソッドも定義できます。

def greeting(name)
  "こんにちは、#{name}さん!"
end

puts greeting("田中")
#=> こんにちは、田中さん!

この例では、name が引数です。greeting("田中") と呼び出すと、"田中" が name に渡されます。

メソッドの戻り値

Rubyでは、メソッド内で最後に評価された式が、基本的に戻り値になります。そのため、単純な処理であれば return を書かなくても値を返すことができます。

def add(a, b)
  a + b
end

result = add(3, 5)

puts result
#=> 8

明示的に return を使用することもできます。

def add(a, b)
  return a + b
end

通常は最後の式を戻り値として利用し、途中で処理を終了して値を返したい場合などに return を使うと、メソッドの意図を分かりやすくできます。

メソッド名の ? と !

Rubyでは、メソッド名の末尾に ? や ! を付ける書き方があります。これらは特別な構文というより、メソッドの役割や性質を分かりやすくするための命名上の慣習として使われます。? を付けたメソッドは、何らかの条件を確認するメソッドであることを表すために使われ、! は通常版のメソッドと比べて注意が必要な処理であることを示すためによく使われます。ただし、特に ! は「必ず元のオブジェクトを変更する」という意味ではありません。

? が付くメソッド

? が付くメソッドは、オブジェクトが特定の条件を満たしているかを確認するためのものが多く、結果として true または false を返すことが期待されます。

puts "apple".include?("a")
#=> true

number = 10

puts number.even?
#=> true

include? は文字列などに指定した値が含まれているか、even? は数値が偶数かどうかを確認するメソッドです。

このように、メソッド名を見るだけで「何かを判定するメソッドなのだな」と分かりやすくなることが、? を使う大きなメリットです。

! が付くメソッド

! が付くメソッドは、通常版のメソッドと比べて副作用などに注意が必要な処理を示すために使われることが多いです。特に、元のオブジェクトを変更するメソッドに使われるケースがあります。ただし、! 自体が「破壊的メソッド」を保証する記号ではないため、「! が付いていれば必ず元のオブジェクトが変更される」と覚えないことが重要です。

arr = [1, 2, 3]

arr.reverse!

puts arr
#=> [3, 2, 1]

この例では reverse! によって、arr 自体の内容が変更されています。

文字列でも使用できます。

text = "   Ruby   "

text.strip!

puts text
#=> "Ruby"

! が付いたメソッドを使用するときは、そのメソッドが実際にどのような動作をするのかを確認することが大切です。

puts、print、p、ppで値を出力する

Rubyでは、プログラムの実行結果やデータの中身を確認するために、puts、print、p、pp などの出力メソッドを使用します。それぞれ出力方法や用途が異なるため、目的に応じて使い分けると便利です。puts は通常の文字列出力、print は改行しない出力、p はデバッグ時に値を確認しやすい形式での出力、pp は複雑なデータ構造を見やすく整形して表示する場合に向いています。)

puts と print

puts は値を出力したあとに改行します。

puts "Hello"
puts "Ruby"

出力結果は次のようになります。

Hello
Ruby

一方、print は基本的に改行せずに出力します。

print "Hello"
print "Ruby"

出力結果は次のようになります。

HelloRuby

そのため、通常のメッセージ表示には puts、改行せずに続けて表示したい場合には print を使用できます。

p でデバッグする

p は、オブジェクトの内容を確認したい場合に便利です。特に文字列の場合、puts では表示されないクォーテーションなども確認できます。

puts "Hello"
#=> Hello

p "Hello"
#=> "Hello"

配列やハッシュなどのデータ構造を確認するときにも便利です。

data = {
  name: "田中さん",
  age: 30
}

p data

pp で複雑なデータを見やすく表示する

pp は、配列やハッシュなどの複雑なデータを整形して表示するためのメソッドです。データ量が多く、p だけでは内容を確認しづらい場合に便利です。Rubyの Kernel#pp として利用でき、現在の Ruby では初回呼び出し時に pp ライブラリが読み込まれます。

data = {
  name: "田中さん",
  age: 30,
  interests: ["プログラミング", "映画鑑賞"]
}

pp data

複雑なデータ構造を確認するときには、p と pp を使い分けるとデバッグしやすくなります。

まとめ

今回は、Rubyでよく使用する文字列の作成方法、条件分岐、メソッド定義、メソッド名の ? と !、値を出力するためのメソッドについて整理しました。文字列では % 記法やヒアドキュメント、sprintf を使うことで、用途に応じた文字列を作成できます。条件分岐では && や ||、case、条件演算子を使い分けることで、さまざまな条件を表現できます。また、メソッドは def を使って定義し、引数を受け取ったり、処理結果を戻り値として返したりできます。? や ! は Ruby 特有のメソッド命名の慣習なので、単なる記号としてではなく、それぞれがどのような意図で使われているのかを理解しておくと、Rubyのコードを読みやすくなります。