操作方法

Rubyのすごいところ

阿草研究室: 水野 洋樹

要約

とりあえずhead書いて

ファイルの先頭10行を表示

$ ./head.rb hoge
foo
bar
...

復習:ファイル操作

# ファイルを開く
file = File.open 'hoge.txt'

# 一行読み込む
file.readline

# ファイルを閉じる
file.close

復習: Intが持つメソッド

# 0から10まで繰り返す
0.upto(10){|n| ... }

# 0,2,4..と繰り返す
0.step(10,2){|n| ... }

# 10回繰り返す
10.times{ ... }

例: head

file = File.open ARGV[0]

10.times{
  print file.readline
}

file.close

ブロックがすごい

高階関数

関数型言語使いにはうれしい

[1,2,3,4,5].map{|x| x*2}            => [2,4,..,10]

[1,2,3,4,5].select{|x| x % 2 == 0 } => [2,4]

[1,2,3,4,5].inject(1){|x,y| x*y }   => 120

ファイルのopenとclose

さっきのheadは例外に弱い

file = File.open ARGV[0]

<ここで例外が起きたらやばい>

file.close

例外をちゃんと処理する

file = File.open ARGV[0]
begin
 ...
ensure
 file.close
end

ブロック付きFile.open

File.open(ARGV[0]) {|file|
  ...
}

headを改良しよう

例: 改良版head その1

File.open(ARGV[0]){|file|
  10.times{
    print file.readline
  }
}

配列がすごい

キューとスタック

stack = []
stack.push 10
stack.push 20

stack.pop => 20
stack.pop => 10

負のindex

末尾からアクセスする

ary = [1,2,3,4,5]

# ary[ary.size-1]と等価
ary[-1] => 5

スライシング

配列の一部を取り出す

ary = [1,2,2,3,4,5]

# 1番目から3番目までを取り出す
ary[1..3] => [2,3,4]

# 0番目から3つ取り出す
ary[0,3]  => [0,1,2]

File#readlines

ファイルの内容を配列で取得する

File.open('hoge.txt'){|file|
  file.readlines => ["a\n", "b\n", ... ]
}

headを改良しよう

例: 改良版head その2

File.open(ARGV[0]){|file|
  print file.readlines[0,10]
}

その他のすごいとこ

Unixコマンドらしい挙動

ちゃんと処理する

def main(file)
  ...
end

unless ARGV.empty? then
  ARGV.each{|path|
    File.open(path){|file|
      main file
    }
  }
else
  main STDIN
end

ARGF / $<

def main(file)
  ...
end

main ARGF

headを改良しよう

例: 改良版head その3

print ARGF.readlines[0,10]

もうワンライナーで十分

$ ruby -e 'print $<.readlines[0,10]' hoge.txt

まとめ