Ruby学習 「プロを目指す人のためのRuby入門」 12章

はじめに

プロを目指す人のためのRuby入門Rubyを学習しています。
重要そうな部分や理解が難しかった部分、忘れそうなことについて学習メモを書きます。
今回は第12章「Rubyに関するその他のトピック」について書いていきます。

記事中のプログラムはirbで動作を確認しました。

日付や時刻の扱い

  • Rubyの標準ライブラリには日付や時刻を扱うクラスがTime、Date、DateTimeの3つある
  • DateクラスとDateTimeクラスはdateライブラリをrequireしないと使用できない
  • Dateクラスは日付を扱うクラス
  • Timeクラスは組み込みライブラリで、newするときにタイムゾーンを指定していないとタイムゾーンがシステムまたは環境変数で設定されているものとなる
  • また、Timeクラスはサマータイムうるう秒を扱える
  • DateTimeクラスはnewするときにタイムゾーンを指定していないとタイムゾーンUTCとなる
{'japan' => 'yen', 'us' => 'dollar'}
=> {"japan"=>"yen", "us"=>"dollar"}

ファイルやディレクトリの扱い

  • Fileクラスは組み込みライブラリでファイルを扱うことができる
  • Dirクラスは組み込みライブラリでディレクトリを扱うことができる
  • FileUtilsモジュールは基本的なファイル操作を集めたモジュール
  • Pathnameクラスはパス名をオブジェクト指向らしく扱うクラス

特定の形式のファイルを読み書きする

  • CSVファイルを読み書きする場合はCSVクラスを使用する
  • CSVクラスでTSVも読み書き可能
require 'csv'
=> true

CSV.open('./lib/sample.csv', 'w') do |csv|
  csv << ['ID', 'Name', 'Age']
  csv << ['tk20', 'tanaka taro', 20]
end
=> <#CSV io_type:File io_path:"./lib/sample.csv" encoding:UTF-8 lineno:2 col_sep:"," row_sep:"\n" quote_char:"\"">

CSV.foreach('./lib/sample.csv', col_sep: ",") do |row|
  puts "#{row[0]}, #{row[1]}, #{row[2]}"
end
ID, Name, Age
tk20, tanaka taro, 20
=> nil
  • JSONJSONライブラリを使用して、読み書きする
require 'json'
=> true

user = { id: 'tk20', name: 'tanaka taro', age: 20 }
=> {:id=>"tk20", :name=>"tanaka taro", :age=>20}

user_json = user.to_json
=> "{\"id\":\"tk20\",\"name\":\"tanaka taro\",\"age\":20}"

puts user_json
{"id":"tk20","name":"tanaka taro","age":20}
=> nil

JSON.parse(user_json)
=> {"id"=>"tk20", "name"=>"tanaka taro", "age"=>20}
  • YAMLはインデントを使ってデータの改装構造を表現するテキストフォーマットで、Railsの設定ファイルでも使用されている
require 'yaml'

yaml = <<TEXT
tanaka:
  id: 'tk20'
  name: 'tanaka taro'
  age: 20
TEXT
=> "tanaka:\n  id: 'tk20'\n  name: 'tanaka taro'\n  age: 20\n"

users = YAML.load(yaml)
=> {"tanaka"=>{"id"=>"tk20", "name"=>"tanaka taro", "age"=>20}}

users['tanaka']['email'] = 'tanaka@example.com'
=> "tanaka@example.com"

puts YAML.dump(users)
---
tanaka:
  id: tk20
  name: tanaka taro
  age: 20
  email: tanaka@example.com
=> nil

環境変数や起動時引数の取得

  • 環境変数はENVという組み込み定数に格納される
  • 起動時引数はARGVという組み込み定数に格納される
  • ワンライナーRubyプログラムをファイルに保存せずに直接Rubyコマンドの引数として渡して実行する
ruby -e 'p "ab,cd,efg".split(",").join'

"abcdefg"

eval、バッククォートリテラル、sendメソッド

  • evalメソッドは受けっと他文字列をRubyのコードとして実行する
code = '"ab,cd,efg".split(",").join'
=> "\"ab,cd,efg\".split(\",\").join"

eval(code)
=> "abcdefg"
  • バッククォートリテラルはバッククォート(`)で囲まれた文字列をOSコマンドとして実行する
`cat ./lib/sample.csv`
=> "ID,Name,Age\ntk20,tanaka taro,20\n"
  • sendメソッドはレシーバに対して指定した文字列またはシンボルのメソッドを実行する
str = 'ruby, java, go'
=> "ruby, java, go"

str.send(:upcase)
=> "RUBY, JAVA, GO"

str.send('split', ',')
=> ["ruby", " java", " go"]

Rake

  • RakeはRubyで作られたビルドツールで、ビルドに限らず何かしらのまとまった処理を簡単に実行するためのツールとしても使用される
  • RakeはRubyを内部DSLとして使用する
# Rakefileにgreetingという名前のタスクを定義
# descメソッドはタスクの説明を定義
desc 'テスト用のタスクです'
task :greeting do
  puts 'Hello!'
end

$ rake greeting
Hello!

$ rake -T
rake greeting  # テスト用のタスクです

# 名前空間を使用し、グループ分けできる
namespace :test_tasks do
  desc 'テスト用のタスクです'
  task :greeting do
    puts 'Hello!'
  end
end

$ rake test_tasks:greeting
Hello!
  • Rakeではよく使用されるタスクがあらかじめ用意されている
  • 下記は複数のテストコードを一括して実行するRake::TestTaskを利用する例
require 'rake/testtask'

# 新しくタスクを定義
Rake::TestTask.new do |t|
  # 実行対象のテストファイルのパターン指定
  t.pattern = 'test/**/*_test.rb'
end

# testタスクをデフォルトのタスクに指定し、タスク名を指定しない場合に実行されるようにする
task defult: :test

$ rake
Run options: --seed 2059

# Running:

Finished in 0.008990s, 1891.0611 runs/s, 3893.3611 assertions/s.

17 runs, 35 assertions, 0 failures, 0 errors, 0 skips

gemとBundler

  • Rubyのライブラリはgemという形式でパッケージングされる
  • 作成したgemはRubyGems.orgというサイトにアップロードできる
  • gemをダウンロードしてインストールするにはgem installコマンドを使用する
  • 特定のバージョンのgemをインストールする場合は-vオプションをつける
  • Bundlerは開発プロジェクトごとにgemの依存関係を管理してくれる
  • Bundlerは同じgemが複数バージョンインストールされている場合、プログラム実行時に使用するバージョンを適切に切り替えてくれる
  • Bundlerで管理するgemはGemfileに記載する
  • Gemfileでgemのバージョンを指定する記号には下記のようなものがある
# バージョン指定なし
gem 'faker'

# バージョン1.7.2に固定
gem 'faker', '1.7.2'

# バージョン1.7.2以上
gem 'faker', '>= 1.7.2'

# バージョン1.7.2以上かつ1.8未満
gem 'faker', '~> 1.7.2'

# バージョン1.7以上かつ2.0未満
gem 'faker', '~> 1.7'

感想

Ruby関連の技術分野の概要を学んだ。今後は開発を通してより深い知識を得ていく。 gem、Bundlerに関しては必須だと思うのでできるだけ早く使えるようにする。

参考文献

この記事は以下の情報を参考にして執筆しました。