【Ruby】基礎文法を公式リファレンスからまとめて理解する
はじめに
Rails でアプリケーションを作成していると Ruby の基礎構文知識がないとでは応用が効かないと感じました。
そこで今回の記事で自分の勉強も踏まえて Ruby の基礎構文についてまとめていきます。
公式リファレンスは現在(2022 年 11 月)の Ruby 最新安定板である Ruby3.1 を参照しています。
Ruby 公式リファレンス
Ruby 概念
インタプリタ言語
- コードを実行する際に 1 行ずつ機械語に翻訳していく言語なのでコンパイル不要
変数宣言
- 変数宣言は不必要(変数の種類は変数名から判断する)
- 型も動的型付けになる
オブジェクト指向
- データをオブジェクトとして持っている
- クラスや継承が利用できる
- 多重継承は禁止
メモリ管理不要
- オブジェクトのメモリ解放は Ruby が自動的にしてくれるためガベージコレクションを実行する必要なし
コメント
#
または=begin
~=end
でコメントアウトが可能です
ここはコメントではありません
# ここはコメントになります
=begin
複数行の
コメントが
できます
=end
変数
Ruby の変数には以下のような種類があります
- ローカル変数
- インスタンス変数
- クラス変数
- グローバル変数
- 定数
ローカル変数
小文字または_
で始まる変数であり、同スコープ内でしか有効ではありません。
class Test
def Sample
# ローカル変数
number = 1
end
def Sample2
puts(number)
# => Sample1と別スコープなのでnumberは使用できない
# => 未定義エラーとなる
end
end
インスタンス変数
@
で始まる変数であり同クラス内で共通利用できます
ただしインスタンスごとには独立した存在になります。初期値はnil
です
class Test
def Sample(value)
@number = value
end
def Sample2
puts(@number)
end
end
test = Test.new()
test.Sample(3)
test.Sample2()
# => 3
クラス変数
@@
で始まる変数であり同クラス内で共通利用できます。(サブクラス/モジュールも含む)
ただしインスタンス変数と違い全てのインスタンスでも共通利用できます。
class Test
@@sum_number = 0
def Sample(value)
@@sum_number += value
end
def Sample2
puts(@@sum_number)
end
end
test = Test.new()
test.Sample(3)
test.Sample2()
# => 3
test2 = Test.new()
test2.Sample(5)
test2.Sample2()
# => 8
# 別インスタンスでも@@sum_numberは共通
グローバル変数
$
で始まる変数でありプログラム内のどこからでも利用できます
$global_value = 'テスト'
def Sample
puts($global_value)
# => テスト
end
def Sample2
$global_value = 'テスト2'
puts($global_value)
# => テスト2
# どこからでも上書きできるため注意が必要
end
定数
アルファベット大文字 ([A-Z]) で始まる変数であり同クラス内で共通利用できます。(サブクラス/モジュールも含む)
メソッド内定義は NG で再代入については警告メッセージが出ます。
クラス外からもクラス名
::定数名
で参照することができます。
class Test
# メソッド外で定義が必要
VALUE = 'テスト'
def Sample
puts(VALUE)
# => テスト
end
def Sample2
VALUE = 'テスト2'
# => 再代入なので警告が出る
end
end
# クラス外参照
puts(Test::VALUE)
条件式
if
条件式が真の場合にその処理をします。
if number == 1
# 条件が真
elsif number == 2
# 条件が真
else
# 条件が偽
end
# 1行での記述
真の場合に実行する処理 if number == 1
unless
条件が偽の場合にその処理をします。
# elsif は使えない
unless number == 1
# 条件が偽
else
# 条件が真
end
# 1行での記述
偽の場合に実行する処理 unless number == 1
三項演算子
条件によって変数代入する値を制御できます。
number == 1 ? 真の場合に実行する処理 : 偽の場合に実行する処理
case
when の条件式が真の場合にそれぞれの処理します。
case number
when 1
# numberが1の場合
end
when 2,3
# numberが2or3の場合
end
else
# numberがどれにも一致しなかった場合
end
繰り返し
while
条件が真の間は繰り返し処理をします。
number = 1
# numberが5を超えていた場合に繰り返し終了
while number <= 5 do
number += 1
end
number = 1
begin
number += 1
# numberが5を超えていた場合に繰り返し終了
end while number <= 5
until
条件が偽の間は繰り返し処理をします。
number = 5
# numberが0を下回った場合に繰り返し終了
until number <= 0 do
number -= 1
end
number = 5
begin
number -= 1
# numberが0を下回った場合に繰り返し終了
end while number <= 0
for
配列などの要素数まで繰り返し処理をします。
numbers = [1,2,3]
for num in numbers
puts(num)
end
# イテレータを使用して書くこともできます
numbers.each {|num|
puts(num)
}
break
繰り返し処理を抜けることができます。
[1,2,3,4,5].each {|num|
# numが3なら繰り返しを抜ける
break if num == 3
puts(num)
}
next
繰り返し処理をスキップして次の繰り返しへ飛ぶことができます。
[1,2,3,4,5].each {|num|
# numが3ならスキップして次の繰り返しへ
next if num == 3
puts(num)
}
例外処理
begin
~resucue
~end
で例外処理になります。(他言語でいうtry
~catch
)
さらにensure
を使用することでエラーの有無にかかわらず処理を実行できます。(他言語でいうfinally
)
また例外を明示的に投げるにはraise
を使用します。
number = 1
begin
if number == 1
# numberが1なら明示的に例外を投げる
raise StandardError.new('エラーが発生しました')
end
else
# エラーが発生する可能性のある処理
end
rescue => e
# begin~rescueの間でエラー発生時に実行される処理
puts(e)
ensure
# エラーの有無にかかわらず実行される処理
end
クラス
クラス名はアルファベット大文字で始まる必要があります。
継承することでスーパークラスの機能を利用することができます。
class Test
# インスタンス生成時に一度だけ実行される
def initialize(name)
@username = name
end
def sample
puts "ユーザー名:#{@username}"
end
end
class SubTest < Test #継承
def initialize(name)
#スーパークラスのinitializeを実行
super(name)
end
def sub_sample
puts('サブクラスのメソッド')
end
end
sub_test = SubTest.new('太郎')
sub_test.sample
sub_test.sub_sample
# => ユーザー名:太郎
# => サブクラスのメソッド
モジュール
モジュール名はアルファベット大文字で始まる必要があります。
クラスとの違いは継承はできずインスタンス生成もできないですが、クラスに組み込み(Mix-in)が可能です。
クラスに組み込み(Mix-in)とするとクラスのインスタンスメソッドもしくはクラスメソッドとしてモジュール利用することができます。
module Test
def hello
puts 'モジュールです'
end
end
class Sample
include Test # Mix-in(インスタンスメソッド扱い)
end
class Sample2
extend Test # Mix-in(クラスメソッド扱い)
end
sample = Sample.new
sample.hello
# => モジュールです
Sample2.hello
# => モジュールです
また、別用途として名前空間としても利用することができます。
module Name
class Test
def self.hello
puts '名前空間です'
end
end
end
Name::Test.hello
# => 名前空間です
メソッド
クラスメソッド
クラスオブジェクトから実行可能なメソッド(他言語でいう static メソッド)
定義時にself.メソッド名
もしくはクラス名.メソッド名
にする必要があります。
利用時はクラス名.メソッド名
もしくはクラス名::メソッド名
で参照することができますがインスタンスから参照することはできません。
もちろんインスタンス変数へのアクセスもできません。
class Test
@@count = 0
def self.set_count
@@count += 1
end
def self.show_count
puts(@@count)
@counter #これはできない
end
end
Test.set_count
Test::show_count
# => 1
test = Test.new
test.show_count #これはできない
インスタンスメソッド
インスタンスオブジェクトから実行可能なメソッド
利用時はインスタンス名.メソッド名
もしくはインスタンス名::メソッド名
で参照することができますがクラスオブジェクトからは参照できません。
クラス変数へはアクセスすることができます。
class Test
@@counter = 0
def initialize(num)
@number = num
end
def show_count
puts(@number)
@@counter #これはできる
end
end
test = Test.new(3)
test.show_count
# => 3
Test::show_count # これはできない
まとめ
Ruby といえば Rails でアプリケーションを作成していくと思います。
ですが Ruby の基礎構文を理解しておかないと実装したい機能に対してどうコーディングすれば良いかわからないことになってしまいます。
なのでアプリケーションを作成する前にこの記事で Ruby 基礎構文を理解できていれば応用が効きやりたいことができるようになります。
ある程度 Ruby が扱えるようになれれば組み込みクラスやメソッドについてもまとめていけたらと思っています。
Discussion