前提
JSと同じようにすべてがオブジェクト
nullではなく、nilで、nilすらもオブジェクト
セミコロン
使わない
コメント
#つかう
# コメント
変数
型推論される
PHPの$なし定義と同じ
ローカル変数は先頭を英小文字か"_"にする
ローカル変数のスコープは宣言されたブロック、メソッド定義
val = 1;
name = 'name'
定数
大文字で定義
定数とか名乗ってるのに再代入できる
MAX = 10
MAX = 11
グローバル変数
$をつける
$global_val = 'global'
関数
英小文字か"_"で始まる必要がある
def ~ end
引数ない場合()が不要
引数ある場合は()内に。デフォルト引数も可能
明示的にreturnしない場合、最後の式の評価が返される。
明示的にreturnもできる
def hello
puts 'hello'
end
def sum(val, val2 = 2)
val + val2
end
def sum2(val, val2 = 2)
return val + val2
end
演算子
特に違いはなさそう
++のインクリメントはない
# 加算
sum = 1 + 1 # 2
# 減算
sub = 5 - 1 # 4
# 乗算
multi = 10 * 2 # 20
# 累乗
expo = 2 ** 3 # 8
# 除算
divi = 10 / 3 # 3
# 剰余
surplus = 10 % 3 # 1
比較に関してもほぼ同じ
===の厳密比較はない
参考演算子はある
puts 10 == 2 # false
puts 10 < 2 # false
puts 10 != 2 # true
puts true ? 'trueです' : 'falseです'
文字列
Stringクラス
シングルクォーテーション、ダブルクォーテーションで囲ったもの
ダブルでは変数埋め込める
hoge = 'hoge'
puts "hello #{hoge}"
配列
[]で定義
連想配列のことはハッシュと呼び、{}で定義する。なおアクセスするときは普通の配列のようになる
arr = [10, 'hgoe']
arr[0] # 10
hash = {'key' => 'value'}
hash['key'] # 'value'
真偽値
何故か0も真になる
falseとnilが偽
puts 0 ? '真' : '偽'
クラス
@@変数名でクラスプロパティを定義できる
PHPでいうstaticプロパティ
@変数名でインスタンス変数を定義できる
PHPでいうプロパティ。いきなりメソッドで定義して使用してよい
def self.メソッド名でクラスメソッドを定義できる
PHPでいうstaticメソッド
class User
# クラスプロパティ(static プロパティにあたる?)
@@name = 'static的な'
def initialize
# PHPでいうプロパティに当たる
@id = 1
end
def updateName
@@name = 'アップデートした'
end
def getId
@id
end
def getName
@@name
end
# クラスメソッド => staticメソッド
def self.hoge
puts 'hoge'
end
end
User.hoge # hoge
# インスタンス化
user = User.new
継承
class Admin < Userのように継承先 < 継承元で指定
モジュール
PHPでいうTraitに近い
module Calculator
def sub(val, val2)
val + val2
end
module_function sub
end
# ruby単体なら読み込みしてやる(Railsなら自動でやってくれてる)
require './calculator.rb'
class Hoge
include Calculator
end
hoge = Hoge.new
hoge.sub(1,2)
制御文
if
if 式 endで記載
式の後ろにthenをつける事もできるが省略してよい
elseifではなくelsif elseとelsでわかりにくく違うくせにelseはある。
そこはelsじゃないんだ...
if 1 < 2 then
end
val = 10
if val < 2
elsif val < 3
else
end
後置if
後ろに書かれているifが先に評価され、trueになれば、前が評価される
多言語使用者読みにくい気がするが、ruby界隈では可読性があがるらしい
val = 0
# 先にif val.zero?が評価される
puts val if val.zero?
for
rubyのforは指定したオブジェクトから順に値を取り出して繰り返しを行う
指定の回数ループさせる場合..で範囲オブジェクトを作成する
そのほかeachも使える
ループ条件がない場合loopが使えるがちゃんとbreakしないと無限ループする
for val in 1..10
puts val
end
(1..10).each { |val|
puts val
}
(1..10).each do |val|
puts val
end
loop {
break
}
例外
begin
# エラーが発生する可能性のある処理
rescue
# エラーが発生した場合の処理
else
# エラーが発生しない場合の処理
ensure
# エラー発生の有無にかかわらず行う処理
end
# エラー投げる
raise "error"