命名規則1.ローカル変数
変数名により用途が決まるので理解が必要。
資格系なら”不適切な変数名”を見抜けるかが大事。
ローカル変数は、代入が行われたブロックまたはメソッドの中だけで有効なスコープの変数。
ローカル変数は以下から構成される。ただし数字は先に来ない。
- アンダースコア「_」
- 英数字
以下は変数名としてN.G.
1 2 3 4 5 6 7 8 |
# アンダースコア以外の記号「-」が使われている variable-1 # これも safe? # 先頭が数値 100_or_1000 # 定数 VARIABLE |
予約後を変数として再定義することはできない。
関数内ならスコープ外のローカル変数を参照すると例外。
1 2 3 4 |
kuma=20 def hoge(x,y) kuma end |
スコープ内で定義されているが評価されていない変数を参照するとnil。
1 2 3 4 5 6 7 8 |
def hoge(x,y) kuma = x + y if x > 10 kuma end > hoge 20,30 => 50 > hoge 5,10 => nil |
命名規則2.グローバル変数
スコープに関係なくどこからでも参照できる変数。
構成する文字はローカル変数と同じ。ただし先頭は「$」。
- アンダースコア「_」
- 英数字
1 2 3 4 5 6 |
$global = 100 def fuga(a,b) $global end > fuga 10,20 => 100 |
リテラルの種類
Rubyのリテラルは以下。
- 数値
- 論理値
- 文字列
- シンボル
- 配列
- ハッシュ
- 範囲
- 正規表現
- ハッシュ
数値リテラル
整数と浮動小数点を使える。符号、指数表記、基数指定が可能。
基数指定でありえない値を指定すると例外。
1 2 3 4 5 6 7 8 9 |
+100 -200 2e2 # 2 に10の2乗を掛ける => 20 5e-e # 5 に10の-3乗を掛ける => 0.05 0b10 # 2進数の10 => 2 0o10 # 8進数の10 => 8 0d10 # 10進数の10 => 10 0x10 # 16進数の10 => 16 0xfg # 16進数でgはNG |
数値リテラル内で桁表現ができる。(ロケールが違うときはどうなるのだろうか?)
1 |
100_000 => 100000 |
有理数(Rational)、複素数(Complex)もリテラル。
有理数は既約になる。浮動小数点にしないで保持できる。
また、小数を既約分数に変換できる!(すごい過剰な感じがする…)
1 2 |
25/45r # (5/9) 3.14r # (157/50) |
複素数は実数、虚数の指定を整数、小数を使って表現できる。
1 2 |
12i # (0+12i) 5.6i # (5+6i) |
有理数、虚数をミックスすることもできる。
1 |
3.14ri # (0+(157/50)i) |
数値クラス
数値クラスのインスタンスである。
一言に数値クラスといっても継承関係によって詳細化されている。
1 2 3 4 |
a = 100 a.class # Fixnum a.class.superclass # Integer a.class.superclass.superclass # Numeric |
数値クラスに実装された演算子により、数値演算、比較演算を実行できるようになっている。
数値演算
代表的な2項演算子は一通り使える。
1 2 3 4 5 |
1+1 # 2 1-2 # -1 3*3 # 9 4/2 # 2 4%3 # 1 |
代表的な比較演算子も一通り使える。
1 2 3 4 |
1==1 # true 1!=5 # true 1<2 # true 2>=1 # true |
怪しい演算子が用意されている。UFO演算子。
演算子の左が大きければ1、等しければ0、右が大きければ-1。
1 2 3 |
500 <=> 10 # 1 500 <=> 500 # 0 10 <=> 500 # -1 |
と書いてあるけど、オペランドがNumericの時の話であって、
一般には「正」「0」「負」の振り分けと考えた方が良さそう。
オペランドが比較不能な場合はnilだそうだ。
if文を使って3方分岐するときに使える。
1 2 3 4 5 6 7 8 |
compare = (hoge <=> fuga) if compare == 0 # hogeとfugaが比較可能で等しいとき elseif compare > 0 # hogeとfugaが比較可能でhogeが大きいとき else # 上記以外 (比較可能でfugaが大きいときを含む) end |
Rubyにはインクリメント演算子、デクリメント演算子は存在しない。
ので代わりに自己代入演算子を使う。
1 2 3 4 |
a = 100 a += 20 # 120 a -= 30 # 90 a *= 2 # 180 |
数値クラスの演算子であることを意識した書き方をすると、
数値の加算を以下のように書ける。
1 2 |
a = 100 a .+(50) # 150 |
メソッド
最後に評価された値が返る。returnで返すとそこで評価が終了する。
returnを書かないと関数内を最後まで読んで何が最終評価か理解しないといけないから
明示的returnを推奨する人もいるが、無いコードも多数ある。資格系はreturn無しの様子。
1 2 3 4 5 |
def add(x,y) x+y end > add 10,20 30=> nil |
1 2 3 4 5 6 7 8 9 |
def predict(hoge) if (hoge) then "OK" else "NG" end end > predict false => "NG" |
仮引数のデフォルト値を指定できる。指定した引数の数が足りない場合は例外。
1 2 3 4 5 |
def add(x,y=200) x+y end add 10 => 210 |
キーワード引数
仮引数に名前をつけることができる。
これによりメソッド実行時に引数としてハッシュオブジェクトを渡せるようになる。
1 2 3 4 5 |
def add(x:,y:) x+y end add (x:100,y:200) => 300 |
キーワード引数にない引数名を指定すると例外。
1 2 3 4 |
def add(x:,y:) x+y end add (x:100,z:200) # 例外 |
ただし、キーワード引数を定義したメソッドに任意の引数を渡すことができる。
1 2 3 4 5 6 7 |
def add(x:,y:,**z) p z x+y end add (x:100,y:200,z:300) # {z=>300} => 300 |