Open26

Rubyメモ

meimeimeimei

matchメソッド

正規表現と文字列がマッチした場合にMatchDataオブジェクトを返す。
MatchDataオブジェクトにはマッチした結果に関する情報を含む。

  • match[0]: マッチした全体の文字列
  • match[1]: 1つ目にマッチした文字列
text = "今日の天気は「晴れ」です。"
match = text.match(/「(.+)」/)
if match
  puts match[0] # => 「晴れ」
  puts match[1] # => 晴れ
end

meimeimeimei

self

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

論理演算子

  • &&and
  • ||or

上記はどちらも同様の働きをするが、以下の点で異なる

  • andor は自己代入できない
  • andor は優先度が低い
puts 'a' && 'b' #=> puts ('a' && 'b')と解釈される 
puts 'a' and 'b' #=> (puts 'a') and bと解釈される
meimeimeimei

==eql?equal? のちがい

==

  • 値が等しいかどうかを判断

eql?

  • == のより厳密バージョンみたいな感じ
  • 型も同じかどうかまで見る
  • ハッシュ値が同じかどうかを判断

equal?

  • オブジェクトIDが同じかどうかを判断
meimeimeimei

Stringクラスの空白文字除去メソッド

strip

文字列の先頭と末尾の空白文字(\t\r\n\f\v)を取り除く
! をつけると破壊的に除去

chomp

末尾から改行コードを取り除く

chop

末尾の文字を取り除く

  • 末尾が \r\n であれば、どちらも取り除く
meimeimeimei

product

レシーバーの配列と引数の配列からそれぞれ1つずつ要素を取り出して新しい配列を返す

['あ', 'い'].product(['う', 'え', 'お'])
#=>
[
     ["あ", "う"],
     ["あ", "え"],
     ["あ", "お"],
     ["い", "う"],
     ["い", "え"],
     ["い", "お"]
]
meimeimeimei

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]
meimeimeimei

Array#flatten!

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

Array#zip

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

ヒアドキュメント

<<EOF

インデントを加えられない
インデントがあるとエラーになる

<<-EOF

インデントを加えることができる

<<~EOF

記述にインデントがあっても、インデントを取り除いた形で解釈される

meimeimeimei

File.dirname

  • 引数に指定した文字列の一番後ろの/より前の文字列を返す
  • /を含まない文字列の場合"."を返す
meimeimeimei
  • for式と if式はスコープを作成しない
    -> この中で初期化した変数でも、その後のコードからアクセス可能
meimeimeimei

ローカル変数

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

clone と dup のちがい

  • どちらもshallow copyで、配列の要素の参照先などまでは複製しない
  • 以下がそれぞれでコピーされるもの

dup

  • インスタンス変数
  • ファイナライザ(ガベージコレクタから見て、インスタンスが破棄されたタイミングで実行されるメソッド)

clone

dup の複製されるものに加えて、

  • 凍結状態
  • 特異メソッド
meimeimeimei

tr tr_s メソッド

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

文字列連結メソッドのちがい

concat <<

元のオブジェクトの内容に文字列を追記 = オブジェクトIDは変わらない

+

文字列を連結した新しいオブジェクトを作成

meimeimeimei

文字列の割り付け

以下いずれも返す文字列の長さと余白を埋める文字列を指定できる

center

  • 中央に割り付け

ljust

  • 左に割り付け

rjust

  • 右に割り付け
'abc'.center(10, *)
#=> '***abc****'
meimeimeimei

日付フォーマット文字列

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

meimeimeimei

Hashからvalueを取得する

Hash#key

  • 引数にキーとなる値を1つ取る

Hash#values

  • 引数をとらない
  • すべてのvalueを集めた配列を返却

Hash#values_at

  • 可変長引数を取る

Hash#[]

  • 引数にキーとなる値を1つ取る

Hash#fetch

  • 引数にキーとなる値を1つ取る
meimeimeimei

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]
meimeimeimei

hex

文字列を16進数として変換

  • 0xとアンダースコアは無視
  • 16進数以外の文字があれば、それ以降は無視

oct

文字列を8進数として変換

  • 8進数以外の変換も可能 例)"0b010".oct => 2
meimeimeimei

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]
meimeimeimei

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" }
meimeimeimei

ファイルのモード

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

クラスインスタンス変数

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

%記法

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