どなブロ

エンジニアァのブログです

たのしいRuby 第3章

めっちゃ写経しますた

コマンドラインからの入力 - ARGV

puts "最初の引数: #{ARGV[0]}"
puts "2番目の引数: #{ARGV[1]}"
puts "3番目の引数: #{ARGV[2]}"
puts "4番目の引数: #{ARGV[3]}"
puts "5番目の引数: #{ARGV[4]}

-> 結果
$ ruby print_argv.rb one two three four five

最初の引数: one
2番目の引数: two
3番目の引数: three
4番目の引数: four
5番目の引数: five


  • ARGVは配列なので要素を取り出し変数に代入することも可
name = ARGV[0]
print "Happy Birthday, ", name, "!\n

-> 結果
$ ruby happy_birth.rb わし

Happy Birthday, わし!


  • 引数から取得したデータは文字列のため、計算する時は数値に変換する必要がある => to_iメソッド
num0 = ARGV[0].to_i
num1 = ARGV[1].to_i
puts "#{num0} + #{num1} = #{num0 + num1}"
puts "#{num0} - #{num1} = #{num0 - num1}"
puts "#{num0} * #{num1} = #{num0 * num1}"
puts "#{num0} / #{num1} = #{num0 / num1}

-> 結果
$ ruby arg_arith.rb 6 8

6 + 8 = 14
6 - 8 = -2
6 * 8 = 48
6 / 8 = 0


ファイルの読み込み

  • 開く→読み込む→出力する→閉じる、の流れ
filename = ARGV[0]
file = File.open(filename) # 「filename」を開き、読み込むためのオブジェクトを返す
text = file.read # readメソッドでデータを読み込み、結果をtextに代入
print text
file.close # 開いたファイルを閉じる

-> 読み込むだけならFile.readメソッドでもっとシンプルに

filename = ARGV[0]
text = file.read(filename)
print text

-> 変数不要であれば1行でも

print File.read(ARGV[0])


  • 全部読み込んで表示だと重い
  • 1行ずつ読み込む度出力するよう変更
filename = ARGV[0]
file = File.open(filename)
file.each_line do |line| # ファイルの各行をそれぞれ処理するメソッド
  print line
end
file.close


  • grep的なコマンドを作る
pattern = Regexp.new(ARGV[0]) # ARGV[0]を元に正規表現オブジェクト作成
filename = ARGV[1]

file = File.open(filename) # ファイルオブジェクト作成
file.each_line do |line|
  if Pattern =~ line # lineの値がpatternの値である正規表現にマッチするか
    print line
  end
end
file.close

-> rubyソースコードChangeLogでmatz氏をgrepした結果
$ ruby simple_grep.rb matz ChangeLog

$ ./ruby benchmark/run.rb --matzruby=./ruby -m bm_app_erb
matz 0.715
$ ./ruby benchmark/run.rb --matzruby=./ruby -m bm_app_erb
matz 0.672
r57183 | matz | 2016-12-26 01:53:00 +0900 (Mon, 26 Dec 2016) | 2 lines
r57181 | matz | 2016-12-26 01:35:51 +0900 (Mon, 26 Dec 2016) | 2 lines


メソッドの作成

def メソッド名
  メソッドで実行したい処理
end
  • 作ってみる
def sayHello
  puts "Hello!!yeaaah!!!!"
end

sayHello()

-> 結果
$ ruby say_hello.rb

Hello!!yeaaah!!!!


別のファイルを取り込む

  • プログラムの中でライブラリを読み込むにはrequireメソッドかrequire_relativeメソッド
  • requireメソッドは既存のライブラリを読む時に使う
  • require_relativeメソッドは、実行するプログラムが置かれたディレクトリを基準にしてライブラリを探す -> さっきのsimple_grepをライブラリにする
def simple_grep(pattern, filename)
  file = File.open(filename)
  file.each_line do |line|
    if pattern =~ line
      print line
    end
  end
  file.close
end

-> 使う

require_relative "grep" #grep.rbの読み込み

pettern = Regexp.new(ARGV[0])
filename = ARGV[1]
simple_grep(pattern, filename) # simple_grepメソッドの起動

-> ChangeLogをmatz氏でgrepの結果
$ ruby use_grep.rb matz ChangeLog

$ ./ruby benchmark/run.rb --matzruby=./ruby -m bm_app_erb
matz 0.715
$ ./ruby benchmark/run.rb --matzruby=./ruby -m bm_app_erb
matz 0.672
r57183 | matz | 2016-12-26 01:53:00 +0900 (Mon, 26 Dec 2016) | 2 lines
r57181 | matz | 2016-12-26 01:35:51 +0900 (Mon, 26 Dec 2016) | 2 lines


  • requireメソッドの例
require "date" # 既存のdateライブラリを読み込む

days = Date.today - Date.new(1991, 11, 5) # 今日の日付 - ワイの誕生日
puts(days.to_i)

-> 結果
$ ruby date_test.rb

9587


  • ppメソッドってのがオブジェクトの構造に合わせて改行して表示してくれるらしい、便利だね!
require "pp"

books = [
{ title: "猫街", author: "萩原朔太郎"},
{ title: "猫の事務所", author: "宮沢賢治"},
{ title: "猫語の教科書", author: "ポール・ギャリコ"},
]

pp books

-> 結果
$ ruby pp_test.rb

[{:title=>"猫街", :author=>"萩原朔太郎"},
 {:title=>"猫の事務所", :author=>"宮沢賢治"},
 {:title=>"猫語の教科書", :author=>"ポール・ギャリコ”}]


感想

  • 面白くなってきた
  • #{}これつえー
  • 写経すると理解が深まって良い。写経オススメされる理由がわかった
  • markdownの書き方も慣れてきた。勉強メモはevernoteにゴリゴリ書いてるんだけど、そこで既にmarkdownで書いちゃうとすぐブログに転用できてよき。そのまま見ると何書いてあるか読みづらくてたまんねーけど。

以上