知っていることだけ

勉強していて役に立つ、理解の助けになるようなポイントを書いていきます。

Ruby 初心者向け基本事項

この記事は以下の読者を対象にしています

  • Ruby初心者
  • 最低限知るべき知識、コードが知りたい
  • 各コードの意味が知りたい

Rubyの傾向

括弧を使わなくてよい言語。空白で代用するか、endでスコープを指定することが多い。行の終わりは改行で判断する。改行忘れ、end忘れに注意。オブジェクト指向の言語

出力

コード 意味
puts "文字列"または変数 出力+改行.変数の値を文字列中で表示するときは#{変数}とすればその位置に現れる
p 変数や文字列 変数をその型通りに表示。文字列なら""付きで表示される。デバッグに便利
print "文字列"または変数 出力.putsとの違いは改行しないこと。

入力・文字列操作

コード 意味
gets 一行読み込み 戻り値の型は文字列
文字列型.chomp 末尾の改行コードを取り除く
文字列.split("分割する目印の記号") 分割。戻り値は配列

コメントアウト

コード 意味
# 一行コメントアウト
=begin 何行でも空いて =end 複数行コメントアウト

演算子

C言語とほぼ同じ。単項演算子++, --はない

if文

if 条件式1
#条件式1が成立したときの処理
elsif 条件式2
#条件式2が成立したときの処理
else
#条件式が、どれも成立しなかったときの処理
end

改行必須

乱数

コード 意味
rand(整数) 0以上整数未満の乱数を返す
rand(数1...数2) 数1以上数2未満の乱数.型は引数に従う
rand(数1..数2) 数1以上数2以下の乱数。型は引数に従う

型変換

コード 意味
変数.to_i 変数をint型にした値を返す
変換.to_f 変換をfloat型にした値を返す

for文

for カウンタ変数 in 繰り返す範囲 do # doは省略可能
繰り返し処理 end

end忘れに注意。改行必須。
「繰り返す範囲」に配列を入れると配列の要素をカウンタ変数に入れる。
「繰り返す範囲」に5..10を入れれば5以上10以下の値が順にカウンタ変数に入る。

for i in 5..10
puts "hello world #{i}"
end

for文の別の書き方としてeachがある。詳細は配列やハッシュの項目を参照。

配列.each do |カウンタ変数|
繰り返し処理 end

while

while 条件式 do # doは省略可能
#繰り返し処理 end

配列

クラスはArrayである。

やりたいこと コード
生成 例:team = ["勇者", "魔法使い", 100, player_1]
このように複数の型が収納できる
箱だけ生成 配列名=Array.new(要素数)
一定初期値で生成 配列名=Array.new(要素数,値)
別の配列を利用して生成

生成する配列 = 元にする配列.map do |要素が入る変数|
要素が入る変数にやる処理 end

例:results2 = numbers.map do |item|
      item * 10
end

2次元配列を初期値で生成 配列=Array.new(行数).map(Array,new(列数,初期化値))
注:Array.new( ,Array.new( , ))ではない。
これだと同じ配列を集めた2次元配列になる
→一つの要素を変更すると全ての配列が変化してしまう。
要素にアクセス 配列[得たい要素のインデックス]
素数を調べる 配列.length
末尾に要素を追加 配列.push(追加する値)
要素に代入 配列[インデックス]=代入する値
要素を削除 配列.delete_at(インデックス)
整列 配列.sort
逆順に整列 配列.sort.reverse
eachでindexとvalueを両方表示 配列.each_with_index do |valueを入れる変数,indexを入れる変数|
処理 end

ハッシュ(連想配列

やりたいこと コード
生成 名前={key => value, ・・・以下同様}
要素にアクセス ハッシュ[key]
長さ ハッシュ.length
追加・更新 ハッシュ[key] = value
削除 ハッシュ.delete(key)
valueのループ処理 ハッシュ.each_value do |valueの入る変数|
処理 end
kye,valueのループ処理 ハッシュ.each do |keyの入る変数,valueの入る変数|
処理 end
keyでソート ハッシュ.sort 戻り値は2次元配列
2次元配列をハッシュにする、ソートと同時に使うことが多い 2次元配列.to_h
valueでソート ハッシュ.sort_by{|k,v| v}
シンボルを用いて記述を簡単に 例:enemies = {zako: "スライム", boss: "ドラゴン", king: "魔王"}
p enemies[:boss]

メソッド.関数のようなもの

  • 定義の仕方
    def メソッド名()
    処理
    end
  • 定義以降(定義した部分より下の行)でしか呼び出せない。
  • 引数はもちろん取れる。
  • return 返り値 で値が返せる。また、returnを省略すると最後の評価式が返る。
  • 引数にキーワードを付けて指定できる

    def say_hello(greeting: "hello", target: "world")
    puts "#{greeting} #{target}"
    end

    say_hello()
    say_hello(greeting: "こんにちは", target: "皆さん")
    say_hello(target: "先生", greeting: "おはようございます")
    say_hello(target: "先生")
    say_hello(greeting: "おはようございます")
    出力結果:
    hello world
    こんにちは 皆さん
    おはようございます 先生
    hello 先生
    おはようございます world

スコープ

ローカル変数 先頭が、英語小文字かアンダーバー「_」で始まる。
メソッド定義のスコープは分離しているため、他の部分の同名のローカル変数に影響を与えない。
グローバル変数 先頭が「$」で始まる。スコープがなく。メソッド定義を超えて利用できる。

ブロック

  • do ... end で囲まれた部分というイメージ
  • メソッド呼び出しの時に、対象データに渡すことのできる処理のかたまりのこと。
  • スコープ
    • ブロック変数は、ブロック外では使えない
    • ブロック内のローカル変数も、ブロック外では使えない
    • ブロック外のローカル変数は、ブロック内で使える
  • do ... end は { ... } で代用できる。

クラス

  • クラスの名前は先頭が大文字でなければならない
  • 定義の仕方

    class Player           # クラス定義
    def walk()
    puts "勇者は、荒野を歩いていた。"
    end

    def attack(enemy)
    puts "勇者は、#{enemy}を攻撃した!"
    end
    end
  • オブジェクトを生成
    オブジェクト=クラス名.new()
    例:
    player1 = Player.new()    # オブジェクトを生成
  • オブジェクトのメソッドを呼び出す
    オブジェクト.メソッド()
    例:
    player1.walk()            # オブジェクトのメソッドを呼び出す
  • オブジェクトの初期化メソッド
    initialize クラスの中でdefする
    例:
    class Player
    def initialize(job) # 初期化メソッド
    @job = job #インスタンス変数の初期化
    end

    def walk()
    puts "#{@job}は、荒野を歩いていた。"
    end
    end
  • インスタンス変数
    クラスを実体化したもの(インスタンス)が持つ変数。
    変数名の先頭に「@」を付ける。
  • インスタンス変数へのオブジェクト外から読み書きする
    許可する内容 コード
    読み書き両方 attr_accessor :インスタンス変数の名前
    (@は名前に含まれないので注意)
    attr_accessor :job
    読みだしのみ attr_reader :インスタンス変数の名前 attr_reader :job
    書き込みのみ attr_writer :インスタンス変数の名前 attr_writer :job