📘

【Ruby】基礎文法を公式リファレンスからまとめて理解する

2022/11/18に公開

はじめに

Rails でアプリケーションを作成していると Ruby の基礎構文知識がないとでは応用が効かないと感じました。
そこで今回の記事で自分の勉強も踏まえて Ruby の基礎構文についてまとめていきます。
公式リファレンスは現在(2022 年 11 月)の Ruby 最新安定板である Ruby3.1 を参照しています。

Ruby 公式リファレンス
https://docs.ruby-lang.org/ja/

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)
}

例外処理

beginresucueendで例外処理になります。(他言語でいうtrycatch
さらに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 が扱えるようになれれば組み込みクラスやメソッドについてもまとめていけたらと思っています。

GitHubで編集を提案

Discussion