rubyはたまにしかいじらないので、いつもすぐに思い出せないrubyの文法をメモしておく。
複数行コメント =begin, =end
文字列にデータ埋め込み "Hello#{var}"
if文
if a > 10
elsif a == 10
else
end
真偽値
false:nilとfalse
true:上記以外
||演算子と&&演算子
C言語とはまったく異なる動作なので覚えるのが辛い。
A||Bでは、AがfalseならB、AがtrueならAの値
A&&Bでは、AがtrueならB、AがfalseならAの値
nilがfalseと判定されるのはObjective-Cと同じ。
irb(main):001:0> nil || "b" => "b" irb(main):002:0> false || "b" => "b" irb(main):003:0> "a" || "b" => "a" irb(main):004:0> nil && "b" => nil irb(main):005:0> false && "b" => false irb(main):006:0> "a" && "b" => "b"
var ||= 1
はvar = var || 1と同じ意味で
varにnilが入っている場合に1をセットし、有効値が入っている場合はそのままという意味になる。
rubyでは変数宣言のみ行うことはできず、必ず代入が必要で、
代入しないと実行時エラーになる。
三項演算子
条件 ? 式1 : 式2
ラムダ
square = ->(n) { return n ** 2 }
p square(5) #=> 25
シンボル
sym = :foo # シンボルリテラルの代入<br> sym = :"foo" # 文字列リテラルからシンボルへの変換<br> str = "#{:foo}" # シンボル変数から文字列への変換<br> str = sym.to_s # シンボル変数から文字列への変換<br> sym2 = str.to_sym # 文字列からシンボル変数への変換<br>
文字列とシンボルは(予約後と被らなければ?)1対1で互いに一意に変換可能であるが、文字列とシンボルは処理速度に大きな開きがあるため、どうしても文字列として処理しなければいけない処理以外はシンボルを利用するのがよい。
C言語でなるべくポインタを利用するのと同じ実行速度を確保するためである。
クラス名の先頭は必ず大文字
インスタンスメソッド
class HelloWorld def hello puts "Hello, world." end end
クラスメソッド
class HelloWorld def self.hello puts "Hello, world." end end
ブロック
メソッド定義の際に最後の引数を「&引数名」の形式にすると、そのメソッドを呼び出すときに与えられたブロックは、
自動的にProcオブジェクトに包まれて引数として渡される。
Procオブジェクトをブロックとして他のメソッドに渡すには「&Procオブジェクト」の形式で指定する。
メタプログラミング
obj.send(name, [arg, ...])
sendメソッドはレシーバの持っているメソッドnameを呼び出すObjectクラスのインスタンスメソッド。
第一引数にはメソッド名をシンボルか文字列で指定する。
メソッドの引数を指定した時は、arg以降に指定する。
objcでのperformSelectorに相当する。
eval
instance_eval
class_eval
これらにはrubyのコードを文字列で与えて評価する。
インスタンスメソッドやクラスメソッドの追加も行える。
instance_evalとclass_evalではコードブロックを受け付けられるがevalではできない。
instance_evalではクラスメソッドが追加され、class_evalではインスタンスメソッドが追加される。
o.is_a? c #oがcまたはそのサブクラスのインスタンスかどうかを判定する。
o.instance_of? c # oのクラスがcかどうかを判定する。
(アスタリスク)
代入やメソッド呼び出しの中の配列にプレフィックスとしてをつけると、配列が個々の要素に展開される。
(アンダースコア)
メソッド引数にを使用すると、その引数を使わないという意味になる。