print "Hello, world!"
puts "Hello, world!"
p "Hello, world!"
print "Hello!"; puts "Hello!"
# コメント
==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'
変数 = 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 条件
真の場合の処理
end
if 条件
真の場合の処理
else
偽の場合の処理
end
if 条件
真の場合の処理
elsif 条件
真の場合の処理
else
偽の場合の処理
end
例:
score = 80
if score > 60
puts "ok"
elsif score > 40
puts "soso"
else
puts "ng"
end
puts "OK" if score > 60
変数 = 条件 ? b : c
b, c = 10, 20
a = b > c ? b : c # 大きい方をaに代入
puts "Hello" if x
true:false, nil以外
false:false, nil(0, ''は含まない)
値に一致した場合に実行する
case オブジェクト
when '値' # 値に一致した場合
処理
when '値', '値' # 2つの値を指定することも可能
処理
else # どの値にも一致しない場合
処理
end
例:
signal = 'red'
case signal
when 'red'
puts 'stop!'
when 'green'
puts 'go!'
else
puts 'caution!'
end
変数に値を代入しながら繰り返す
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 条件 do
処理
end
doは省略可能。
例:
i = 0
while i < 3 do
puts "#{i}. Hello"
i += 1
end
条件が偽の間繰り返す
until 条件 do
処理
end
doは省略可能。
無限ループ
loop {
処理
}
抜けるためにはif文を使用する。
指定回数繰り返す
数値.times{|変数| # 変数に回数が代入される
処理
}
数値.times do |変数| # 変数に回数が代入される
処理
end
回数は0から始まる。|変数|は省略可能。
例:
3.times do
puts "Hello"
end
3.times do |i|
puts "#{i}. Hello"
end
変数に値を代入しながら繰り返す
配列/ハッシュ/範囲.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
変数にハッシュのキー / 値を代入しながら繰り返す
ループから抜ける
ループを1回スキップ
ループの最初に戻る
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算 |
% | 剰余(除算の余り) |
** | 累乗 |
**→*, /, %→+, -の順に計算される。同じ優先順位のものは、左から順番に計算される。
== | 等しい |
!= | 等しくない |
> | 左が右より大きい |
< | 左が右より小さい |
>= | 左が右以上 |
<= | 左が右以下 |
&& | 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...)
.の代わりに::を使うこともできる。
オブジェクトの作成時に実行される
class クラス名
def initialize(引数1, 引数2...)
処理
end
end
インスタンス変数の初期化などに使用される。
初期値を指定することもできる:
def initialize(引数1 = 初期値1, 引数2 = 初期値2...)
処理
end
class クラス名
def クラス名.メソッド名(引数1, 引数2...)
処理
end
end
実行:
クラス名.メソッド名
クラス名.メソッド名(引数1, 引数2...)
| 定義場所 | 継承 | 定義方法 | 共有範囲 | ||
|---|---|---|---|---|---|
class内 | def内
| ||||
| クラス変数 | ○ | ○ | ○ | @@変数名 = 値 | クラスごと |
| インスタンス変数 | × | ○ | ○ | @変数名 = 値 | オブジェクトごと |
| クラスインスタンス変数 | ○ | × | × | @変数名 = 値 | クラスごと |
| ローカル変数 | × | ○ | × | 変数名 = 値 | メソッドごと |
インスタンス変数:クラス内の全メソッドで変数を使いたいときに使う。
クラス変数: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 モジュール名
| .abs | 絶対値を取得 | 負の値には括弧をつける((-3).abs)
|
| .ceil | 切り上げ | |
| .floor | 切り捨て | |
| .integer? | 整数かどうか | 1.0もfalseになる
|
| .round | 四捨五入 | |
| .to_f | 浮動小数点数に変換 | |
| .to_i | 整数に変換 | 小数点以下切り捨て.to_i(16):16進数
|
| .to_s | 文字列に変換 |
| .even? | 偶数かどうか | |
| .gcd() | 指定値との最大公約数 | |
| .gcdlcm() | 指定値との最大公約数と最小公倍数を配列で | |
| .lcm() | 指定値との最小公倍数 | |
| .odd? | 奇数かどうか |
| .ascii_only? | アスキー文字のみかどうか | |
| .bytesize | バイト数 | |
| .empty? | 空文字列かどうか | |
| .downcase, ! | 小文字に変換 | |
| .length | 文字数 | |
| .size | ||
| .reverse, ! | 文字を逆順に並べる | |
| .split("") | 指定文字で分割し配列に変換 | ""(空白文字):1文字ごと |
| .strip, ! | 空白の削除 | \t, \r, \n, \f, \vも削除される
|
| .lstrip, ! | 先頭の空白の削除 | |
| .rstrip, ! | 末尾の空白の削除 | |
| .to_f | 浮動小数点数に変換 | |
| .to_i | 整数に変換 | 引数で何進数かを指定可能 |
| .upcase, ! | 大文字に変換 |
| .empty? | 空かどうか | |
| .clear | 配列を空にする | |
| .delete_at() | 指定個目の要素を削除 | |
| .last | 末尾の要素 | 引数で末尾から何個か指定可能 |
| .length | 要素数 | |
| .size | ||
| .push | 末尾に追加 | |
| .reverse, ! | 要素を逆順にする | |
| .sample | 要素をランダムに返す | 引数で、返す数を指定可能 |
| .sort, ! | 並び替え(昇順) | |
| .to_h | 多次元配列をハッシュに変換 | |
| .uniq, ! | 重複した様を削除 |
| .clear | ハッシュを空にする | |
| .delete() | 指定キーを削除 | |
| .empty? | 空かどうか | |
| .has_key?() | キーが存在するか | true / false |
| .key?() | ||
| .member?() | ||
| .include?() | ||
| .has_value?() | 値が存在するか | true / false |
| .value?() | ||
| .key() | 引数と値が一致した要素のキーを返す | ない場合nil
|
| .keys | キーのみを配列に | |
| .length | 要素数 | |
| .size | ||
| .shift | 先頭の要素を削除 | |
| .to_a | 多次元配列に変換 | |
| .values | 値のみを配列に |
| .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 | タイムゾーン |
| %% | % |