復習にRubyの書籍を読んでいます。
自分の理解が不十分だった点を書き留めます。
empty?メソッド
その文字列の長さが0のときにtrueを返します。
正誤表現によるマッチング
「=~」を使います。
>> p /Ruby/ =~"Ruby" 0 => 0 >> p /Ruby/ =~ "Diamond" nil => nil
比較演算子 ===
case分ではwhenで指定した値に一致するかどうかを「===」を使って判定します。
「===」は以下のような挙動をとります。
■左辺が数値が文字列の場合は「==」と同じ意味
■正規表現の場合は「=~」と同じようにマッチしたかを判定する
■クラスの場合はそのクラスのインスタンスかどうかを判定する
> p(/zz/==="xyzzy") true => true >> p(String==="xyzzy") true => true >> p((1..3)===2) true => true >>
when文をif文で書き換える
case value when A 文1 when B 文2 else 文3 end if A === value 文1 elsif B === value 文2 else 文3 end
オブジェクトの同一性を確かめたいとき
object_id(__id__)メソッドを使います。
> ary1=[] => [] >> ary2=[] => [] >> p ary1.object_id 118820 => 118820 >> p ary2.object_id 125100 => 125100 >> p ary2.__id__ 125100 => 125100 >>
なお、2つのオブジェクトそのもの(ID)が同じかどうかはequal?
メソッドで判定します。
>> str1="foo" => "foo" >> str2=str1 => "foo" >> str3="f"+"o"+"o" => "foo" >> p str1.equal?(str2) true => true >> p str1.equal?(str3) false => false
「値」が同じかどうかを調べるには「==」を使います。
> p str1==str2 true => true
デフォルト値を指定する
デフォルト値は、引数を省略してメソッドを呼び出したときに使われる値です。
「引数名=値」と書きます。
def hello(name="Ruby") puts "Hello, #{name}." end hello() hello("Newbie")
メソッドが複数の引数をもつ場合は、引数リストの右端から順にデフォルト値を指定します。
例えば、3つの引数のうち2つを省略可能にする場合は右側の2つにデフォルト値を指定します。
メソッド定義の中のyieldはブロック付きメソッドを定義する際に最も重要なキーワードです。
引数の数が不定なメソッド
❯ irb ?> def foo(*args) ?> args >> end >> p foo(1,2,3) [1, 2, 3] => [1, 2, 3]
少なくとも1つは指定しなければならない引数があるメソッドを定義したい場合は以下のとおりです。
?> def meth(arg,*args) ?> [arg,args] >> end => :meth >> p meth(1) [1, []] => [1, []] >> p meth(1,2,3) [1, [2, 3]] => [1, [2, 3]]
「*変数名」の形式の引数はメソッド定義の引数リストに1つだけ含めることができます。
最初の引数と最後の引数は決まった名前で受け取って、その間の引数は省略できるようにしたい場合は次のようにします。
?> def a(a,*b,c) ?> [a,b,c] >> end => :a >> p a(1,2,3,4,5) [1, [2, 3, 4], 5] => [1, [2, 3, 4], 5] >> p a(1,2) [1, [], 2] => [1, [], 2]
キーワード引数
def メソッド名(引数1:引数1の値,引数2:引数2の値,...) 実行したい処理 end