Bonkura - Kenny

SIerで働く文系SEの記録

【たのしいRuby_17】I/Oクラス

たのしいRubyの第17章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

プログラムの外部とデータをやり取りする為の機能として、入力(Input)と出力(Output)を提供する。

標準入出力

プログラムを起動すると、3つのI/Oオブジェクトが予め割り当てられている。

標準入力

標準出力

標準エラー出力

ファイルの入出力

ファイルを開く

io = File.open(fil,mode)
  • mode:どのような目的でファイルを開くか?デフォルトは読み取り専用("r")。他にも"w"(書き込み専用)など。

ファイルを閉じる

io.close

File.openメソッドにブロックを渡すと自動的に閉じれくれる。

ファイルのデータを一度に読み込む

data = File.read("hoge.txt")

基本的な入出力テンプレ

File.open("hoge.txt") do |io|
  io.each_line do |line|
    line.chomp!
    p line
  end
end

ファイルポインタ

効率よくデータを読み書きするために、ファイルを固定サイズのブロックの集まりと考えて、データの位置を決め打ちでアクセスする。 IOオブジェクトがファイルのどこを指しているか? と示す情報を ファイルポインタ(カレントファイルオフセット) という。

【たのしいRuby_16】正規表現クラス

たのしいRubyの第16章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

正規表現で書かれたパターンを保持するオブジェクトを正規表現オブジェクト」 と呼ぶ。

正規表現の作り方

  • //で囲む
  • re = Regexp.new("Ruby")
  • %r(パターン)

正規表現メソッド「=~」

  • マッチしない場合: nil
  • マッチした場合: マッチする文字列が始まる文字の位置

オプション

「/.../」という書式の後ろに続けて 「/.../im」 というように指定する。

  • i:大文字と小文字の違いを無視
  • m:複数行マッチ

キャプチャ

正規表現でマッチした部分の一部を取り出す。

/(.)(.)(.)/ =~ "ABC"

a = $1
b = $2
c = $3

特殊な変数

  • (?:):キャプチャする必要ない場合
  • 「$`」:マッチした文字列より前の文字列
  • 「$&」:マッチした文字列
  • 「$'」:マッチした文字列より後の文字列

メソッド

文字列の置き換えメソッド。ブロックを取る事も出来る。subは最初にマッチしたところのみ。gsubは全部。 ブロックを渡すと、マッチした部分がブロックに渡り処理された文字列が元のマッチした部分と置き換わる。

str.gsub(/+s/,' ')

マッチした文字列を取り出す。置き換えはしない。scanメソッドは、引数で指定した正規表現のパターンとマッチする部分を文字列からすべて取り出し、配列にして返しす。マッチする部分がなければ、空の配列を返します。

"abcdafhtajklalsljla".scan(/.a/) do |match|
p match.upcase
end

【たのしいRuby_15】ハッシュクラス

たのしいRubyの第15章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

ハッシュオブジェクトは配列オブジェクトと似て非なるもの。配列は「インデックス」を用いて各要素にアクセスしたが、ハッシュでは 「キー」を用いて要素にアクセスする。

ハッシュの作り方

  • {キー => 値,キー => 値}
  • Hash.new("hoge")

hogeには「登録されていないキーを指定した時に返す値」を入れる。

値の登録と取り出しメソッド

h.store("R","Ruby")
p h.fetch("R") => "Ruby"

キーや値をまとめて取り出す

ハッシュのデフォルト値

  • h = Hash.new(1)
  • ハッシュのデフォルト値を生成するブロックを指定
h = Hash.new do |hash,keys|
hash[key] = key.upcase
end

その他メソッド

h = {"a" => "b", "c" => "d" }

# キー・値の存在チェック
p h.key?("a") #=> true
p h.value?("b") #=> true

# 登録されているキーの数
p h.length #=> 2

# 何もキーが登録されていないかどうか?
p h.empty? #=> false
h2 = Hash.new
p h2.empty? #=> true

# キーの削除。(ブロックを渡すとキーが存在しなかった場合にブロックを実行した結果を返す。)
h2 = {"R" => "Ruby","P" => "Perl"}
p h2.delete("Y") {|key| "no #{key}" }

# 条件を与えてその条件に当てはまるものだけ削除。
p h2.delete_if{|key,value| key == "P" } #=> {"R" => "Ruby"}

# ハッシュへの要素追加
h2.store("J","Java")
p h2

# ハッシュのクリア
h2.clear
p h2

【たのしいRuby_14】文字列クラス

たのしいRubyの第14章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

Rubyでの文字列は全て、 Stringクラスのオブジェクト

文字列の作り方

  • "" 」:文字列オブジェクトを作る区切り文字
  • '' 」:「\n」などの特殊文字を解釈せずそのまま表示
  • , 」:文字列の結合

ヒアドキュメント

str = <<-"EOB"
Hello!
Hello!
Hello!
EOB

puts str

printfとsprintf

n = 123
printf("%d\n", n)

最初の引数にフォーマット、2つ目移行の引数が%の所に入る。

メソッド色々

str = "This is a pen."
str2 = " これはペンです。"

# 文字列の長さ・空かどうかを調べる。
p str.length
p str.size
p "".empty?

# 文字列のインデックス
p str[0] #=> T

# 文字列の結合
str3 = str + str2
p str3

# 文字列を配列に分割
str4 = "ホゲ:hoge:12345"
column = str4.split(/:/)
p column

# 改行がある場合のみ削る
# each_lineeメソッドを使って新しい行を読み込む場合によく使う。
str6 = "abcde\n"
str7 = str6.chomp
p str7

# 文字列を探す。(見つかった場合は一致部分の先頭インデックスを返す。)
p str.index("pen")
p str.rindex("pen") # 右側から探す

# 文字列を探す。(あればtrueを返す)
p str.include?("pen")

# 文字列の変換系
s.upcase #小文字→大文字
s.downcase #大文字→小文字
s.swapcase #大文字→小文字、小文字→大文字
s.capitalize #最初の一文字が大文字、以降を小文字

【たのしいRuby_13】配列クラス

たのしいRubyの第13章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

配列の作り方

# オーソドックス
nums = [1,2,3]
# newを使う
a = Array.new
a = Array.new(5)
# 要素に空白を含まない文字列の配列を作りたい時
lang = %w(Ruby Perl Phython Scheme Pike)
# 要素に空白を含まないシンボルの配列を作りたい時
lang = %i(Ruby Perl Phython Scheme Pike)
  • to_aメソッド;オブジェクトを配列に変換
  • splitメソッド:空白やカンマで句切られた文字列から配列を作る
colum = "2013/5/30 22:33 foo.html".split()

要素の取り出し

  • a[n]:0から始める。
  • a[-n]:後ろから一つ目の要素を取り出す。
  • a[n..m]:nからmまでをあたらしい配列で返す
  • a[n...m]:nからm-1までをあたらしい配列で返す
  • a[a,len]:aからlen個の要素を取り出す

要素の置き換え

  • a[n] = item

要素の挿入

  • a[a,0]=[1,2]:aの前に挿入される。

values_atメソッド

複数のインデックスを使って飛び飛びに要素を参照し新しい配列を作るメソッド

alpha = %w(a b c d e f)
p alpha.values_at(1,3,5) #=> ["b","d","f"]

配列を集合として見たメソッド

ary1 = ["a","b","c"]
ary2 = ["b","c","d"]

p (ary1 & ary2) #共通集合
p (ary1 | ary2) #和集合

#「+」でも配列を結合出来る。

配列を集合として見たメソッド

  • 共通集合: ary1 & ary2
  • 和集合:ary1 | ary2
ary1 = ["a","b","c"]
ary2 = ["b","c","d"]

p ary1 & ary2
p ary1 | ary2

配列を列として見たメソッド

p ary1.push("d")
p ary1.pop
# pushメソッドは << で代替可能。

その他メソッド

ary1 = [1,nil,2,nil,3,4,5]
ary2 = [0,1,2,3,4,5,6]
ary3 = [1,2,3,1,2,3]

# 配列の要素からnilを取り除く
ary1.compact!
p ary1

# 配列から値を指定して要素を取り除く
ary2.delete(2)
p ary2

# 配列からインデックスを指定して要素を取り除く
ary2.delete_at(2)
p ary2

# ブロックを実行した結果が真だった場合に、要素を取り除く
ary2.delete_if { |i| i > 3 }
p ary2

# ユニーク
ary3.uniq!
p ary3

# sort
ary3.sort!