読者です 読者をやめる 読者になる 読者になる

新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

学習記録:Ruby

[Ruby] 学習記録

内容:5章 主な組み込みクラス/モジュール(続)

Enumerable(続)
  • Hash
    • 任意のオブジェクトをキーとして他のオブジェクトを対応付けたオブジェクトの集まりを表現
    • キーとなるオブジェクトにはhashというメソッドが実装されている必要(Objectクラスには実装されている)
    • 繰り返し処理:each, each_key, each_value
    • =で追加、deleteで削除
hash = {}
hash[:foo] = 'bar'
hash.delete(:foo)
    • マージ:merge
    • キーと値の入れ替え:invert
    • キーや値が存在するか:has_key?, key?, member?, include? (全て同じ挙動)
    • キーや値の取得:keys(キーを配列で返す), values(値を配列で返す)
people = %w(Alice Bob Charlie).to_enum
ages = [14, 32, 23].to_enum

loop do
  person = people.next
  age = ages.next

  puts "#{person} -> #{age}"
end # "Alice -> 14", "Bob -> 32" ...
TIme
  • Timeクラス
    • 時刻をUNIXエポック(1970/1/1)からの経過秒数として保持
    • Time.now( or TIme.new)で得られる
    • to_i, to_f, to_r, to_sで変換
    • year, month, day, hour, min, sec, nsecで各値を得る
    • sunday?, monday? などで特定の曜日か否か判定
    • 比較: 1秒以下の数字も扱っているので、見た目が同じでも==で真になるとは限らない
    • 加算・減算:+, -
    • at(sec):UNIXエポックからsec秒経ったTimeオブジェクトを得る
    • strftime:文字列表現を得る
now = Time.now
now.strftime('%Y/%m/%d %H:%M:%S') # => "2014/07/07 22:30:21"
IO ・File
  • ファイルの読み込み
    • closeを用いて閉じる必要があるが、ブロックに渡した場合ブロックが終了すると自動で閉じられる
fIle = File.open('fname.txt')
puts file.read
file.close

File.open 'fname.txt' do |file|
  puts file.read
end
    • each_lineで一行ずつ繰り返し処理
  • ファイルの書込み
    • openの第二引数に'w'などを指定
    • f.write, f.puts, f.printなどで書込み
  • アクセス位置の操作
    • rewind:先頭に戻る
    • seek:任意の位置に移動
  • オブジェクト操作
    • flock:ファイルのロック
    • atime, ctime, mtime:最後にアクセス/状態を変更/更新した日時
    • size:ファイルサイズ
    • rename, unlink:名前変更(移動)、削除
    • symlink, link:シンボリックリンク、ハードリンク
    • chmod, chown
  • ファイルパスの操作
fname = '/etc/resolv.conf'

# ディレクトリパス
File.dirname(fname) # => /etc
# ファイル名
File.basename(fname) # => resolv.conf
# 拡張子を除いたファイル名
File.basename(fname, '.*') # => resolv
# 拡張子
File.extname(fname) # => .conf
Dir
  • ディレクトリ操作のためのクラス
    • pwd, home, chdir
    • entries:ファイルの一覧を取得
    • mkdir, rename, rmdir
Thread
  • 同じプロセス上でメモリを共有しつつ、処理を並列に実行
    • Thread.fork(new, start)でスレッドを作成し処理を実行
files = %w(.xinitrc .zshrc .vimrc)
threads = files.map {|file|
  Threads.fork {
    num = File.readlines(file).length
    "#{file}: #{num}"
  }
}

threads.map(&:value) # => [.xinitrc: 58, ...]
Fiber
  • ある処理を途中まで実行して、その後任意のタイミングで前回の続きから処理を行う
fiber = Fiber.new {
  puts 'Hello, Fiber'

  # 中断
  Fiber.yield

  puts 'Hello (again)'
}
# Hello, Fiberと表示
fiber.resume

# Hello (again) と表示
fiber.resume

# FiberError
fiber.resume