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クラスはパス名をオブジェクト指向らしく扱うクラス
特定の形式のファイルを読み書きする
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
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}
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
# 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に関しては必須だと思うのでできるだけ早く使えるようにする。
参考文献
この記事は以下の情報を参考にして執筆しました。