文字列の表示 / 改行の扱い

文字列を出力(末尾に改行なし)

print "Hello, world!"

文字列を出力(末尾に改行あり)

puts "Hello, world!"

文字列を出力(データ型を表示)

p "Hello, world!"

1行にまとめる

print "Hello!"; puts "Hello!"

コメント

1行コメント

# コメント

複数行コメント

==begin
  コメント
==end

変数 / 定数

変数を代入

msg = "Hello, world!"

定数を代入

EMAIL = "example@example.com"

1文字目が大文字だと定数として認識されるが、すべて大文字で書く。

多重代入

x, y = 3, 5

左辺の変数の数よりも右辺の値の数が少ない場合、超えた分はnilが代入される。

グローバル変数

$global = 10

プログラムのどこからでも参照できる。

数値オブジェクト

記法

整数 10
実数 20.5
分数(3分の1) 1/3r
Rational(1, 3)

数値オブジェクトはアンダーバー(_)を無視するため、桁の大きい数値を書くときに、100_000_000と書くことができる。

文字列オブジェクト

記法

変数展開 特殊文字(\n, \t
ダブルクォーテーション
シングルクォーテーション × ×

変数展開

p "Hello, #{name}!"

演算子

連結

puts 'Hello, ' + 'world!'    # Hello, world!

繰り返し

puts 'Hello' * 3             # HelloHelloHello

配列オブジェクト

記法

sales = [3, 8, 2]

配列の指定番目の要素を取得

p sales[1]

配列の値を変更

sales[1] = 8

添字の指定方法

[1] 2個目
[0..2] 1〜3個目
[0...2] 1・2個目
[-1] 最後
[0, 2] 1番目から2個分(1・2個目)

添字の数字は0から始まる。

配列の途中に要素を追加

sales[1, 0] = [10, 11]    # 2個目の要素の後に10, 11を追加

配列の末尾に要素を追加

sales << 100 << 102

配列同士を連結

x = a + b

ハッシュオブジェクト

記法

sales = {"yamada" => 100, "tanaka" => 200}

シンボル(少し高速):

sales = {:yamada => 100, :tanaka => 200}
sales = {yamada: 100, tanaka: 200}

ハッシュの指定キーの要素を取得

p sales["yamada"]

シンボル(少し高速):

p sales[:yamada]

ハッシュの値を変更

sales["yamada"] = 120

時刻オブジェクト

現在時刻を代入

変数 = Time.now / 変数 = Time.new

指定時刻を代入

変数 = Time.new(年, 月, 日, 時, 分, 秒, タイムゾーン)
変数 = Time.utc(年, 月, 日, 時, 分, 秒)

月以降は省略可能。

タイムゾーン指定例:'+09:00'

エポック秒(UNIX)で指定して代入

変数 = Time.at(1970/01/01からの経過秒数)

時刻計算

秒を足したり引いたりすることで、時間の計算ができる。

p Time.new + 60    # 1分後
p Time.new + 60 * 60 * 24 * 3    # 3日後

%記法

s = %Q(Hello)

()は、記号または括弧なら何でも良い:

s = %Q{Hello}
s = %Q!Hello!
% 文字列(式展開有効)
%Q
%q 文字列(式展開無効)
%x 文字列(バッククォート)
%W 文字列の配列(式展開有効) スペース区切り(スペースを含む文字列は\でエスケープ)
%w 文字列の配列(式展開無効)
%r 正規表現

式展開有効:ダブルクォーテーションと同じ

式展開無効:シングルクォーテーションと同じ

条件分岐

if

if 条件
  真の場合の処理
end
if 条件
  真の場合の処理
else
  偽の場合の処理
end
if 条件
  真の場合の処理
elsif 条件
  真の場合の処理
else
  偽の場合の処理
end

例:

score = 80
if score > 60
  puts "ok"
elsif score > 40
  puts "soso"
else
  puts "ng"
end

後置if

puts "OK" if score > 60

条件演算子

変数 = 条件 ? b : c

b, c = 10, 20
a = b > c ? b : c    # 大きい方をaに代入

真偽値判定

puts "Hello" if x

truefalse, nil以外

falsefalse, nil0, ''は含まない)

case

値に一致した場合に実行する

case オブジェクト
when '値'           # 値に一致した場合
  処理
when '値', '値'     # 2つの値を指定することも可能
  処理
else               # どの値にも一致しない場合
  処理
end

例:

signal = 'red'
case signal
when 'red'
  puts 'stop!'
when 'green'
  puts 'go!'
else
  puts 'caution!'
end

繰り返し

for

変数に値を代入しながら繰り返す

for 変数 in 配列/範囲 do
  処理
end

doは省略可能。

例:

for i in 0..2 do
  puts "#{i}. Hello"
end
for color in ["red", "blue", "green"] do
  puts color
end

while

条件が真の間繰り返す

while 条件 do
  処理
end

doは省略可能。

例:

i = 0
while i < 3 do
  puts "#{i}. Hello"
  i += 1
end

until

条件が偽の間繰り返す

until 条件 do
  処理
end

doは省略可能。

loop

無限ループ

loop {
  処理
}

抜けるためにはif文を使用する。

.times

指定回数繰り返す

数値.times{|変数|    # 変数に回数が代入される
  処理
}
数値.times do |変数|    # 変数に回数が代入される
  処理
end

回数は0から始まる。|変数|は省略可能。

例:

3.times do
  puts "Hello"
end
3.times do |i|
  puts "#{i}. Hello"
end

.each, .each_pair

変数に値を代入しながら繰り返す

配列/ハッシュ/範囲.each{|変数|
  処理
}
配列/ハッシュ/範囲.each do |変数|
  処理
end

.each.each_pairは同じ。|変数|は省略可能。

例:

["red", "blue", "green"].each do |color|
puts color
end
{"red"=> 100, "blue"=> 200}.each do |color, price|
puts "#{color}: #{price}"
end

.each_key / .each_value

変数にハッシュのキー / 値を代入しながら繰り返す

break

ループから抜ける

next

ループを1回スキップ

redo

ループの最初に戻る

演算子

算術演算子

+ 加算
- 減算
* 乗算
/ 除算
% 剰余(除算の余り)
** 累乗

***, /, %+, -の順に計算される。同じ優先順位のものは、左から順番に計算される。

比較演算子

== 等しい
!= 等しくない
> 左が右より大きい
< 左が右より小さい
>= 左が右以上
<= 左が右以下

論理演算子

&& AND
|| OR
! NOT

例:

score < 80 && score > 60    // 60より大きく80より小さい

自己代入演算子

短縮した演算子 意味
x += y x = x + y
x -= y x = x - y
x *= y x = x * y
x /= y x = x / y
x %= y x = x % y
x **= y x = x ** y

メソッド

メソッドの定義

def メソッド名(引数1, 引数2...)
  処理
end

例:

def sayHi(name)
  puts "Hello, #{name}"
end

メソッド内で定義された変数は、メソッド外からはアクセスすることができない。

初期値の指定

値が指定されなかった場合に使われる

def メソッド名(引数1 = 初期値1, 引数2 = 初期値2...)
  処理
end

返り値の指定

メソッドの返り値を変数に代入できる

def hello()
  return "Hello"
end
s = hello()

メソッドの実行

メソッド名
メソッド名()
メソッド名(引数1, 引数2...)

破壊的メソッド

元データも書き換える

.メソッド名!のものが破壊的メソッド。

真偽値を返すメソッド

true / falseを返す

.メソッド名?のものが真偽値を返すメソッド。

クラス

クラスの定義

class クラス名
end

クラス名の最初は大文字で指定する。

クラスからオブジェクトを作成

変数名 = クラス名.new()

インスタンスメソッド

class クラス名
  def メソッド名(引数1, 引数2...)
    処理
  end
end

実行:

変数.メソッド名
変数.メソッド名(引数1, 引数2...)

.の代わりに::を使うこともできる。

initializeメソッドの定義

オブジェクトの作成時に実行される

class クラス名
  def initialize(引数1, 引数2...)
    処理
  end
end

インスタンス変数の初期化などに使用される。

初期値を指定することもできる:

def initialize(引数1 = 初期値1, 引数2 = 初期値2...)
  処理
end

クラスメソッド

class クラス名
  def クラス名.メソッド名(引数1, 引数2...)
    処理
  end
end

実行:

クラス名.メソッド名
クラス名.メソッド名(引数1, 引数2...)

クラス変数 / インスタンス変数 / クラスインスタンス変数 / ローカル変数

定義場所 継承 定義方法 共有範囲
classdef
クラス変数 @@変数名 = 値 クラスごと
インスタンス変数 × @変数名 = 値 オブジェクトごと
クラスインスタンス変数 × × @変数名 = 値 クラスごと
ローカル変数 × × 変数名 = 値 メソッドごと

インスタンス変数:クラス内の全メソッドで変数を使いたいときに使う。

クラス変数:initializeメソッドと組み合わせて、オブジェクトが作成された数などを数えることができる。

クラスインスタンス変数:クラス変数を継承させたくない場合に使う。

クラス内で定義された定数

メソッド内では定義できない

定義は通常の定数と同じ。

クラス外からの呼び出し:

クラス名::定数名

クラスの継承

メソッドが継承される

class 新クラス名 < 継承元のクラス名
end

継承後のクラスで同盟のメソッドが定義された場合、上書きされる。

継承元のメソッドを呼び出す

def クラス名
  super
end
def クラス名
  super(引数1, 引数2...)
end

スーパークラス(親クラス)で同盟のメソッドがあった場合、それを実行する。

インスタンス変数にクラス外からアクセスする

クラス内に次のように書いておく:

class クラス名
  attr_accessor :変数名    # readerとwriter両方
  attr_reader :変数名      # 取得のみ
  attr_writer :変数名      # 変更のみ
end

取得 / 変更:

オブジェクト.変数名        # 取得
オブジェクト.変数名 = 値    # 変更

モジュール

モジュールの定義

中にメソッド(def ... end)を入れる。

module モジュール名
end

使用方法は、関数として使用するか、クラスに読み込むかである。

関数として使用する

まずモジュール内に以下のコードを書く:

module_function :メソッド名

そして以下のコードを書く:

モジュール名.メソッド名
モジュール名.メソッド名(引数1, 引数2...)

module_functionは実行させたいメソッドすべてについて書かなければならない。

クラスに読み込む

クラス内に以下のコードを書く:

include モジュール名

組み込みライブラリ - メソッド

数値(Numeric)クラス

.abs 絶対値を取得 負の値には括弧をつける((-3).abs
.ceil 切り上げ
.floor 切り捨て
.integer? 整数かどうか 1.0falseになる
.round 四捨五入
.to_f 浮動小数点数に変換
.to_i 整数に変換 小数点以下切り捨て
.to_i(16):16進数
.to_s 文字列に変換

└整数(Integer)クラス

.even? 偶数かどうか
.gcd() 指定値との最大公約数
.gcdlcm() 指定値との最大公約数と最小公倍数を配列で
.lcm() 指定値との最小公倍数
.odd? 奇数かどうか

文字列(String)クラス

.ascii_only? アスキー文字のみかどうか
.bytesize バイト数
.empty? 空文字列かどうか
.downcase, ! 小文字に変換
.length 文字数
.size
.reverse, ! 文字を逆順に並べる
.split("") 指定文字で分割し配列に変換 ""(空白文字):1文字ごと
.strip, ! 空白の削除 \t, \r, \n, \f, \vも削除される
.lstrip, ! 先頭の空白の削除
.rstrip, ! 末尾の空白の削除
.to_f 浮動小数点数に変換
.to_i 整数に変換 引数で何進数かを指定可能
.upcase, ! 大文字に変換

配列(Array)クラス

.empty? 空かどうか
.clear 配列を空にする
.delete_at() 指定個目の要素を削除
.last 末尾の要素 引数で末尾から何個か指定可能
.length 要素数
.size
.push 末尾に追加
.reverse, ! 要素を逆順にする
.sample 要素をランダムに返す 引数で、返す数を指定可能
.sort, ! 並び替え(昇順)
.to_h 多次元配列をハッシュに変換
.uniq, ! 重複した様を削除

ハッシュ(Hash)クラス

.clear ハッシュを空にする
.delete() 指定キーを削除
.empty? 空かどうか
.has_key?() キーが存在するか true / false
.key?()
.member?()
.include?()
.has_value?() 値が存在するか true / false
.value?()
.key() 引数と値が一致した要素のキーを返す ない場合nil
.keys キーのみを配列に
.length 要素数
.size
.shift 先頭の要素を削除
.to_a 多次元配列に変換
.values 値のみを配列に

時刻(Time)クラス

.dst? 夏時間があるかどうか
.isdst
.getgm UTC変換
.getutc
.getlocal ローカル時間帯に変換
.gmt? UTCかどうか
.gmt_offset UTCとの差を秒で
.gmtime 元データをUTC変換
.localtime 元データをローカル時間帯に変換
.strfttime("") 日時形式を整形
.sec 秒を取得
.min 分を取得
.hour 時を取得
.mday 日を取得
.day
.wday 曜日(日〜土=0〜6)を取得
.mon 月を取得
.month
.yday 1/1からの通算日
.year 年を取得
.zone タイムゾーンを表す文字列
.曜日? その曜日かどうか(sunday〜saturday)
strfttime
%A 曜日(Sunday...)
%a 曜日の省略形(Sun...)
%B 月(January...)
%b 月の省略形(Jan...)
%c 日付と時刻
%d 日(01-31)
%H 24時間制の時(00-23)
%i 12時間制の時(01-12)
%j 1/1からの通算日(001-366)
%M 分(00-59)
%m 月(01-12)
%p AM, PM
%S 秒(00-59)うるう秒は60
%U 日曜始まりの週(00-53)
%W 月曜始まりの週(00-53)
%w 曜日(0-6)日曜が0
%X 時刻
%x 日付
%Y 西暦
%y 西暦の下2桁
%Z タイムゾーン
%%