MENU

Ruby初心者の基本構文まとめ

Rubyの学習・開発を行う上で学んだ基本構文の備忘録です。

2019年11月4日現在ではドットインストール「Ruby入門」レベルのことを記載しています。

もう少し基本的な内容を確認する場合は以下をご参照ください。(ProgateのRubyコースの学習記録)
30DAYSトライアル4th(Rails)の学習内容まとめ【DAY1】
30DAYSトライアル4th(Rails)の学習内容まとめ【DAY2】
30DAYSトライアル4th(Rails)の学習内容まとめ【DAY3】
30DAYSトライアル4th(Rails)の学習内容まとめ【DAY4】

目次

目次

標準出力

<pre class="lang:ruby decode:true " >
puts 出力値    # 値の後に改行が入る
print 出力値    # 値の後に改行は入らない
sprint 出力値    # 値が返る
p 出力値    # デバッグ用(文字列の囲み文字「""」や「''」まで出力される</pre> 

変数

# 変数に数値を代入
変数名 = 数値

# 変数に文字列を代入
変数名 = "文字列" or '文字列'

定数

# 定数名は全て大文字で定義する
定数名 = 値

# 定数宣言後に定数の値を変更すると警告がでるが、値は変更され処理が継続されるので注意

数値・文字列

# 文字列は「"」または「'」で囲む
puts "文字列"
puts '文字列'

# 「"」で囲んだ場合は文字列に変数を組み込める
puts "文字列に#{変数名}を組み込める"

# 文字列同士を「+」で演算すると文字列と文字列を結合する
# 文字列と数値を「+」で演算するとエラーになる

配列

array = [値1, 値2, 値3]
# 添字          0         1            2
# 添字         -3       -2           -1

p array[0]
p array[-1]
p array[0..2]      # 添字0〜2
p array[0...2]      # 添字0〜2の直前まで
p array[5]           # nil(範囲外)

p array[0] = 変更値        # 値変更
p array[1..2] = [変更値1, 変更値2]        # 範囲指定で値変更
p array.push(変更値)       # 一番後ろに追加
p array. << 変更値       # 一番後ろに追加
p array.size               # 要素数取得
p array.sort               # 並び替え

ハッシュ

# 以下全てハッシュの定義。3番目が最も使用される
hash = {key1 => value1, key2 => value2}
hash = {:key1 => value1, :key2 => value2}
hash = {key1: value1, key2: value2}

p hash.size                       # 要素数を取得
p hash.keys                       # Keyの一覧を取得
p hash.values                     # 値の一覧を取得
p hash.has_key?(:value1)         # Key存在チェック

オブジェクトを変換

x = 50
y = "3"

#
p x + y.to_i        # yをinteger型に変換
p x + y.to_f        # yをfolat型に変換
p x.to_s + y        # xをstring型に変換

object = {value1: 200, value2: 400}
p object.to_a       # ハッシュ → 配列変換      [[:value1, 200], [:value2, 400]]
p object.to_a.to_h       # 配列 → ハッシュ変換      [[:value1, 200], [:value2, 400]]

%記法

# 文字列に変数を埋め込む際の書式を指定する
#%s      文字列
#%d      数値
#%f      不動小数点

p "name: %s" % "Jyu2"        # %s部分を"Jyu2"に置き換え
p "name: %10s" % "Jyu2"      # %s部分を10桁分確保して"Jyu2"に置き換え
p "name: %-10s" % "Jyu2"     # %s部分を10桁分確保して左寄せで"Jyu2"に置き換え

p "id: %05d, rate: %10.2f" % [355, 3.284]       # %d部分を左0梅で[]の中の値に置き換え

printf("name: %10s\n", "Jyu2")
printf("id: %05d, rate: %10.2f\n", 355, 3.284)
p sprintf("name: %10s\n", "Jyu2")
p sprintf("id: %05d, rate: %10.2f\n", 355, 3.284)</pre> 

条件分岐

if文

if 条件
  処理
elsif 条件2
  処理2
elsif 条件3
  処理3
   ・
   ・
   ・
else
  処理4
end

# 比較演算子
# ==:左辺と右辺が等しい
# !=:左辺と右辺が等しくない
# > :左辺が右辺より大きい
# >=:左辺が右辺以上
# < :左辺が右辺より小さい
# <=:左辺が右辺以下

case文

case 値
when 条件1
  処理1
when 条件2
  処理2
    ・
    ・
    ・
else
  処理
end

繰り返し処理(ループ)

while文

while 条件 do
    処理
    # 処理の中で条件がfalseとなるようにする必要がある
end

times文

# 指定したループ回数文ループ
# |変数名|の中に現在のループ回数がセットされる
ループ回数.times do |変数名|
    処理
end

# {}を使用して1行で記述
ループ回数.times { |変数名| 処理 }

for文

# ループ開始数値〜ループ終了数値までループし、ループ中の値が変数に格納される
for 変数名 in ループ開始数値..ループ終了数値 do
  処理
end

# 配列の値分ループし、ループ中の値が変数に格納される
for 変数名 in [値1, 値2] do
  処理
end

# ハッシュの値分ループし、ループ中のキーと値が変数に格納される
for キー格納用変数名, 値格納用変数名 in {キー1:値1, キー2:値2} do
  処理
end

each文

# 数値の順番にループし、ループ中の値が変数に格納される
(ループ開始数値..ループ終了数値).each do |変数名|
    処理
end

# 配列の値の順番にループし、ループ中の値が変数に格納される
[値1, 値2].each do |変数名|
  処理
end

# 配列の値の順番にループし、ループ中の値が変数に格納される
{キー1:値1,キー1i値1}.each do |キー格納用変数名, 値格納よう変数名|
  処理
end

# for文は内部的にはeach文ででている

loop文

# 永久にループさせる場合に使用する
# ループ内の処理で「break」を記述しないと永久ループになる
loop do
  処理

  # 以降の処理はとばして次のループを開始する(他言語のcontinue)
  next

  # 以降の処理はとばしてループを抜ける
  break
end

メソッド

# メソッドの定義
def メソッド名(引数1, 引数2, ・・・・)
  処理

  # return以降の処理は実行されない
  # returnを省略するとメソッド内の最後の判定の値が呼び出し元に返る
  return 戻り値
end

# メソッド呼び出し1
戻り値用変数名 = メソッド名(引数1, 引数2, ・・・・)

# 引数が複雑でない場合は以下でも良い
メソッド名 引数

# 引数の初期値を指定
def メソッド名(引数1 = 初期値)
  処理
end

# 「!」つきのメソッドは大元のオブジェクトの値も書き換えるというルールがある
# 例)
name = "Jyu2"
puts name.upcase    # 大文字に変換して出力する
puts name.upcase!    # nameの値を全て大文字に変換して出力する

# 真偽値(true/false)を返すメソッドは「?」をつけるというルールがある
# 例)
p name.empty?    # nameが空かどうか?
p name.include?("y")    # nameに"y"が含まれているか?
引数のデフォル値と設定できる
def sayHi(name = "tom")
    return puts "hi! #{name}"
end

sayHi("taguchi")
# sayHi "taguchi"     # sayHi("taguchi")と同じ意味。
sayHi

# 「!」つきのメソッドは大元のオブジェクトの値も書き換えるというルールがある
# 例)
name = "Jyu2"
puts name.upcase    # 大文字に変換して出力する
puts name.upcase!    # nameの値を全て大文字に変換して出力する

# 真偽値(true/false)を返すメソッドは「?」をつけるというルールがある
# 例)
p name.empty?    # nameが空かどうか?
p name.include?("y")    # nameに"y"が含まれているか?

クラス

# メソッドのアクセス権
# - public:どこからでも呼び出せる
# - protecte:特殊
# - private:クラス内のみ。レシーバーを指定できない。initializeは自動的にprivateとなる。

# クラス名の一文字目は大文字
class クラス名

  # クラス変数(クラス内で保持される変数。先頭に「@@」をつける)
  @@クラス変数名 = 値

  # クラス定数。全て大文字とする
  クラス定数名 = 値

  # アクセサの定義
  # インスタンス変数のアクセサ(getter、setter)を定義する
  # getter(ゲッター): 指定した変数を取得する
  # setter(セッター): 指定した変数を更新
  attr_accessor :インスタンス変数名       # getter、setterを生成
  attr_reader :インスタンス変数名       # getterのみを生成
  attr_writer :インスタンス変数名       # gsetterのみを生成

  # インスタンス生成時に必ず実行されるメソッド(コンストラクタ)
  # 主にインスタンス変数の初期化を行う
  def initialize(引数1, 引数2, ・・・)
      @インスタンス変数名 = 値    # インスタンス変数は先頭に「@」をつけるルール
  end

  # インスタンスメソッド
  def メソッド名
    処理

    # インスタンス変数は「self.インスタンス変数名」でも表現できる
    # 「self」はオブジェクトそのものを表す
    self.インスタンス変数名 = 値

    # プライベート
    # プライベートメソッドの呼び出しは本来であると「self.プライベートメソッド名」となるが、
    # プライベートメソッドにはオブジェクトは指定できないため以下のようになる。
    プライベートメソッド名
  end

  # クラスメソッド
  # インスタンスを生成しなくても使用可能
  def self.クラスメソッド名
      処理
  end

  # プライベートメソッド
  # クラスの外からの呼び出しはできない
  private

    def プライベートメソッド名
        処理
    end
end

# インスタンスの生成
# initializeメソッドが実行されるため、引数にはinitializeメソッドのものを指定する
インスタンス名 = クラス名.new(引数1, 引数2, ・・・・)

# インスタンス変数の更新
インスタンス名.インスタンス変数名 = 値

# クラスメソッド呼び出し
クラス名.クラスメソッド(引数1, 引数2, ・・・・)

# クラス定数取得
変数名 = クラス名::クラス定数名

クラスの継承

# 継承元 -> 親クラス
# 継承先 -> 子クラス

class 子クラス名 < 親クラス名

  # 子クラスのインスタンスメソッド
  def メソッド名
      処理

      # 親クラスのprivateメソッドの呼び出しができる
      親クラスプライベートメソッド名
  end

  # オーバーライド
  # 親クラスと同じ名前のクラスメソッドを定義することで、
  # メソッドを上書きすることができる
  def 親クラスのメソッド名
    処理
  end

  # 親クラスのプライベートメソッドをオーバーライドすることもできる
  # 下記の例だと子クラスの中ではパブリックメソッドとなる
  def 親クラスのプライベートメソッド名
      処理
  end
end

モジュール

使用用途は以下がある。

  • 名前空間の管理
  • メソッド名が他のクラスと重複してしまうことを防ぐ

  • ミックスイン
  • 継承関係のないクラスに共通処理を埋め込むことができる

# インスタンスの生成や継承などはできない
# モジュール名の一文字目は大文字
module モジュール名

  # メソッドの定義
  def メソッド名
      処理
  end

  def メソッド名
    処理
  end
end

# モジュールの呼び出し
モジュール名.メソッド名

# ミックスインの例
class クラス名
    # ミックスイン
    include モジュール名
end

# ミックスインすることで、モジュールのメソッドが使用可能となる
クラス名.new.モジュールのメソッド名

例外処理

class 例外名 < Ruby標準の例外名(StandardErrorなど); end

begin   # Javaでは「try」
    raise 発生させる例外名    # javaでは「throw」
rescue 例外名   # Javaでは「catch」
    処理
rescue => 例外を格納する変数名
    p 変数名.message    # 例外の名前を出力
    p 変数名.class      # 例外が発生したクラスを出力
ensure    # 他の言語では「finally」。例外が発生する、しないにかかわらず必ず処理が実行される
    処理
end
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ソフトウェア会社(SIer)で10年以上勤務のシステムエンジニア|ポケットWiFi使用歴2年以上|ポケットWiFi+αで快適でお得なインターネット環境を構築するための情報を発信|その他、IT情報やWebサービス、アプリ、ガジェットなどの情報を発信|自分と他の人のカバンの中身を紹介するメディア「カバンの中身ラボ(https://kaban-no-nakami-labo.com/)」も運営しています。
ポケットWiFi選びに迷ったらTwitter、お問合せフォームからご連絡ください。

コメント

コメント一覧 (1件)

コメントする

目次