Open26
Rubyメモ

matchメソッド
正規表現と文字列がマッチした場合にMatchData
オブジェクトを返す。
MatchData
オブジェクトにはマッチした結果に関する情報を含む。
- match[0]: マッチした全体の文字列
- match[1]: 1つ目にマッチした文字列
text = "今日の天気は「晴れ」です。"
match = text.match(/「(.+)」/)
if match
puts match[0] # => 「晴れ」
puts match[1] # => 晴れ
end

self
- クラス内でインスタンスメソッドを呼ぶ場合、そのメソッドが現在のオブジェクトのものであれば、
self
を省略できる - ただし、代入する際は
self
を明示しなければ、ローカル変数への代入であるとみなされてしまう

論理演算子
-
&&
とand
-
||
とor
上記はどちらも同様の働きをするが、以下の点で異なる
-
and
やor
は自己代入できない -
and
やor
は優先度が低い
puts 'a' && 'b' #=> puts ('a' && 'b')と解釈される
puts 'a' and 'b' #=> (puts 'a') and bと解釈される

==
と eql?
と equal?
のちがい
==
- 値が等しいかどうかを判断
eql?
-
==
のより厳密バージョンみたいな感じ - 型も同じかどうかまで見る
- ハッシュ値が同じかどうかを判断
equal?
- オブジェクトIDが同じかどうかを判断

Stringクラスの空白文字除去メソッド
strip
文字列の先頭と末尾の空白文字(\t\r\n\f\v)を取り除く
※ !
をつけると破壊的に除去
chomp
末尾から改行コードを取り除く
chop
末尾の文字を取り除く
- 末尾が
\r\n
であれば、どちらも取り除く

product
レシーバーの配列と引数の配列からそれぞれ1つずつ要素を取り出して新しい配列を返す
['あ', 'い'].product(['う', 'え', 'お'])
#=>
[
["あ", "う"],
["あ", "え"],
["あ", "お"],
["い", "う"],
["い", "え"],
["い", "お"]
]

each_cons
Array#each_cons(cnt)はselfからcnt個ずつ要素を取り出しブロックに渡す
(1..5).each_cons(2) { |num_arr| p num_arr }
#=>
[1, 2]
[2, 3]
[3, 4]
[4, 5]

Array#flatten!
- 破壊的にselfを再帰的に平坦化するメソッド
- 平坦化が行われない場合は、nilを返す

Array#zip
- レシーバーと引数の配列の各要素からなる配列の配列を返却する
- 生成される配列の要素数は、レシーバーと同じ
p [1, 2, 3, 4].zip([1, 2])
#=> [[1, 1], [2, 2], [3, nil], [4, nil]]

ヒアドキュメント
<<EOF
インデントを加えられない
インデントがあるとエラーになる
<<-EOF
インデントを加えることができる
<<~EOF
記述にインデントがあっても、インデントを取り除いた形で解釈される

File.dirname
- 引数に指定した文字列の一番後ろの/より前の文字列を返す
- /を含まない文字列の場合"."を返す

- for式と if式はスコープを作成しない
-> この中で初期化した変数でも、その後のコードからアクセス可能

ローカル変数
- トップレベルで定義されたローカル変数をクラス内部から参照できない
- クラス内に定義されたメソッドからは、トップレベルで定義されたローカル変数もクラス内部で定義されたメソッド外のローカル変数も参照できない

clone と dup のちがい
- どちらもshallow copyで、配列の要素の参照先などまでは複製しない
- 以下がそれぞれでコピーされるもの
dup
- インスタンス変数
- ファイナライザ(ガベージコレクタから見て、インスタンスが破棄されたタイミングで実行されるメソッド)
clone
dup の複製されるものに加えて、
- 凍結状態
- 特異メソッド

tr
tr_s
メソッド
-
tr
メソッド
指定したパターンに一致する文字を検索し置換"hoge".tr('a-z', 'A-Z') #=> 'HOGE'
-
tr_s
メソッド
tr
の効果に加えて、重複文字を省く"hooogee".tr_s('a-z', 'A-Z') #=> 'HOGE'

文字列連結メソッドのちがい
concat
<<
元のオブジェクトの内容に文字列を追記 = オブジェクトIDは変わらない
+
文字列を連結した新しいオブジェクトを作成

文字列の割り付け
以下いずれも返す文字列の長さと余白を埋める文字列を指定できる
center
- 中央に割り付け
ljust
- 左に割り付け
rjust
- 右に割り付け
'abc'.center(10, *)
#=> '***abc****'

日付フォーマット文字列
%x または %D
日付(%m/%d/%y)
%F
日付(%Y-%m-%d)
%m
月を表す数字(01-12)
%M
分(00-59)
%d
日(01-31)
%y
西暦の下2桁(00-99)
%Y
西暦を表す数(9999)

Hashからvalueを取得する
Hash#key
- 引数にキーとなる値を1つ取る
Hash#values
- 引数をとらない
- すべてのvalueを集めた配列を返却
Hash#values_at
- 可変長引数を取る
Hash#[]
- 引数にキーとなる値を1つ取る
Hash#fetch
- 引数にキーとなる値を1つ取る

Array#each_slice(n)
selfからn個で配列を区切りブロックに渡す
p [1, 2, 3, 4, 5, 6, 7, 8].each_slice(4)
#=>
[1, 2, 3, 4]
[5, 6, 7, 8]

hex
文字列を16進数として変換
- 0xとアンダースコアは無視
- 16進数以外の文字があれば、それ以降は無視
oct
文字列を8進数として変換
- 8進数以外の変換も可能 例)
"0b010".oct => 2

assoc
配列の配列を検索して、その 0 番目の要素が key に == で等しい最初の要素を返す
(なければ nilを返す)
a = [[1, 3], [2, 4], [3, 5]]
a.assoc(3) #=> [3, 5]
rassoc
配列の配列を検索して、その 1 番目の要素が key に == で等しい最初の要素を返す
(なければ nilを返す)
a = [[1, 3], [2, 4], [3, 5]]
a.rassoc(3) #=> [1, 3]

merge
- 自分自身と、引数で指定されたハッシュを統合する
- 自分自身の設定が引き継がれる
a = { "hoge" => "fuga", "foo" => "bar" }
a.merge({ "abc" => "def", "hoge" => "hoge" })
# => { "hoge" => "fuga", "foo" => "bar", "abc" => "def" }
merge!
- 自分自身と、引数で指定されたハッシュを統合する
- 元のオブジェクトが変更される
a = { "hoge" => "fuga", "foo" => "bar" }
a.merge!({ "abc" => "def", "hoge" => "hoge" })
a # => { "hoge" => "hoge", "foo" => "bar", "abc" => "def" }

ファイルのモード
-
r
: 読み込みモード -
w
: 書き込みモード。既存のファイルがあれば中身を空にする -
a
: 追記モード -
r+
: 読み書きモード。ファイルの読み書き位置が先頭になる -
w+
: 読み書きモード。既存のファイルがあれば中身を空にする -
a+
: 読み書きモード。ファイルの読み込みは先頭から。書き込みは末尾から追記。

クラスインスタンス変数
- クラスもRubyのオブジェクトの1つ
- よってクラスも他のオブジェクトと同様にインスタンス変数を持つことができ、これを
クラスインスタンス変数
という - クラス変数ではないので、継承先などで値が共有されることはない

%記法
- %/ /: ダブルクォート文字列
- %r/ /: 正規表現
- %w/ /: 要素が文字列の配列