独自gem作成その3 / 体裁整え, README
前回の 独自gem作成では、実際のコードを書いてテスト完了し、rubocopによりraisのスタイルガイドに沿っているかチェックをしたところまでやりました🙂
本日は続きをやっていきます!
目次
1.rubocopの検証
前回の rubocop の検証では、26個のC
の警告が出ているところまでやりました!
これらをひとつひとつ確認して修正していきます。
26個のC
の内容と対処方法は以下のとおりです💪
重複している内容もあるので、全部で8種類でした🙂
Style/FrozenStringLiteralComment: Missing magic comment # frozen_string_literal: true.
→ # frozen_string_literal: true
と記載し、直後に空白の1行を入れる(出典 )
Style/StringLiterals: Prefer double-quoted stringsunless you need single quotes to avoid extra backslashes for escaping.
→ ' text '
の表記を" text "
に修正(出典)
Style/UnneededPercentQ: Use %q only for strings that contain both single quotes and double quotes.
→ %q{ text }
の表記を" text "
に修正(出典)
Style/HashSyntax: Use the new Ruby 1.9 hash syntax.
→ ハッシュの記法を Ruby1.9 以降のものに修正(出典)
Layout/SpaceInsideParens: Space inside parentheses detected.
→ ( calc )
の中にある余計なスペースを削除(出典)
Layout/TrailingBlankLines: Final newline missing.
→ 最終行に空白行を追加(出典)
Layout/SpaceAroundOperators: Operator = should be surrounded by a single space.
→ =
の前後に連続しているスペースを1つにする(出典)
Layout/SpaceInsideBlockBraces: Space between { and | missing.
→ {| text | }
の {
の後にスペースを1つ入れる(出典)
これらをひとつひとつ修正しました😊
2.READMEを記述
公開する前に、README.md
に gem に関する情報を書いておきます。
コードではなく、人にわかるように文章を書きます💡ここに書いておくと、他の方が README を読んで、どんな gem なのか知ることができます✨
デフォルトでは以下のような状態です。
これを自分なりに書いていきます。
ここまでできたら無事公開!のはずですが…
Githubの使い方わからないので、一旦Githubの勉強を挟みます🙏
道のりは長い😂
独自gem作成その2 / Gemの作成, RSpecテスト, rubocop
本日は具体的に gem を作っていきます!
目次
1.gemのアイデア
作る gem のアイデアですが、いろいろと考えた結果、数値を英語に変換してみようと思います!
例えば1
をone
に変換するやつです。
gem の名前はconv_num_words
にします!
2.実際に作ってみる
2-1. gemテンプレートの作成
まずは以下のコマンドで gem のテンプレートを作ります。
$ bundler gem conv_num_words
作る場所はどこでも良いのですが、私はホームディレクトリにしました!
この時点で自動的に gem に必要な沢山のファイルが作成されます。
gem は沢山のファイルによって構成されているため、IDE(統合開発環境)でgem のルートディレクトリを開いたほうが作業しやすいです✨
わたしの場合は Visual Studio Code を使っています🙂
IDEを使うと、いちいちメモ帳のようなエディタを開いて編集しなくても、ディレクトリの中のファイルをツリーで確認しながら、ファイル間を行ったり来たりできるようになります!
細かくて見にくいですが、以下が IDE(Visual Studio Code)の編集画面です。
ざっくり分類分けすると、左側に gem を構成するディレクトリ、メイン部分がコードエディタ、下部にターミナルがあります👀
この画面は、次に編集するgemspec
を開いているところです😊
2-2. gemspecの修正
先程の操作で自動的に作成されたファイルのうち、gemspec
というファイルを編集します💪
TODO:
で始まるところがダミーなので、そこに自分の情報に置き換えます。
とは言っても description などは作っているうちに変わりそうなので、とりあえず今はTODO:
を取り外したり、ソースコードURLをコメントアウトにして、後で編集し直すことにします🤗
2-3. 実際のコードを記述
テンプレート作りが終わったので、今度は実際にコードを書いていきます。
数値を英文字に変換するという同じ発想の方がいらっしゃったので、かなり参考にさせていただきました!
コードを書くのはlib/conv_num_words.rb
の中です。
Numericクラスを拡張していく形で変換前後を定義していきます。
21以上の数は大変なので、桁(hundred, thousand)ごとに計算式を書きます✍️
2-4. ビルドして実行
コードが書けたら、ビルドしてみます!
ビルドのためにまずexe
ファイルを作成する必要があります。
gemのルートディレクトリで以下のコマンドを実行します。
$ mkdir exe
$ touch exe/conv_num_words
$ chmod +x exe/conv_num_words
この一連の流れは、1行目でexe
ディレクトリを作り、2行目でその中にconv_num_words
というファイルを作り、3行目でconv_num_words
の実行権限を付与しています💡
次に、以下のコマンドを実行してビルドします。
$ bundle exec rake build
このあたり参考にしたページのリンクを載せておきます👏
qiita.com
続いて、gemをインストールします!
$ gem install pkg/conv_num_words-0.1.0.gem
ここで確認のため、 irb を起動してrequire
'gem名'を実行して
true`になると良いです👌
エラーが出たら修正して、再ビルドして再インストールです😊😊
私は修正したきり再ビルドせずに irb を繰り返して何度も同じエラーを見ていながら、修正が反映されないことに気づくのが遅かったです笑
2-6. テスト
次に、spec/conv_num_words_spec.rb
を編集します。
RSpecを使ってテストを行います。
上のキャプチャは、conv_num_words
のNumericクラスに対して、to_w
を使ったときに予測できる変換前後を述べています。
テスト名(テストが成功したときに表示される名前)をconvert number into words
にしています。
一応全ての通りの組み合わせがテストできるように書いてみたつもりですが、見落としがあったらご指摘ください😶
テストを書いたら、ターミナルで以下のコマンドを実行します👆
$ bundler exec rspec spec
※コマンドがbundler
だったりbundle
だったりぶれてしまい申し訳ありません。どちらでも良いようです笑
テスト完了です!
ここで予測した答えと実際の答えが一致しないと、以下のように丁寧に教えてくれます。
2-7. rubocopで検証
ここまできたらもうパッケージ化して公開ですが、その前にひとつ確認しておくことがあります🤨
それは Ruby のコードはスタイルガイドに則っているか?ということです。
コードが正しくても、インデントがめちゃくちゃだと見にくいので、Rubyのスタイルガイドに合わせて書き直す必要があります。
github.com
このスタイルガイドに則って書けているか確認する rubocop というものを試してみます。
rubocop が未インストールの場合は以下のコマンドでインストールします。
$ gem install rubocop
使い方は簡単で、チェックしたいコードが書かれているファイルがあるディレクトリに移動し、rubocop
を実行するだけです。
私の場合はホームディレクトリに作っているconv_num_words
というディレクトリに移動してrubocop
を実行します☀️
ただし、はじめはrails本家の設定にするために一手間加えます🙂
まずは対象のディレクトリに移動し、.rubocop.yml
というファイルを作成します。
とりあえずtouch
で作成しました!ls -a
で作成できたことが確認できますね〜🌝
もちろん、IDEのほうでも確認できます。というかIDEで編集します。
rails本家のrubocop.yml
ファイルが公開されているので、これを作成したファイルの中身に反映させます✨
こんな感じになります。
いよいよターミナルで以下のコマンドを実行してみます!
$ rubocop
すると、長々とメッセージが現れます。
黄色のC
の文字が目立ちますね👀
このアルファベットは、見つかった違反の種類を指しています。
違反の重要度が重い順にFatal
, Error
, Warning
, Convention
があります。
メッセージに現れるC
は一番軽い違反を教えてくれています。
最後の1行には、8 files inspected, 26 offenses detected
と書かれており、26個の違反が見つかったことが分かります🙄
これを修正してから、パッケージ化をして公開、という手順を踏んでいきます。
さて、これをひとつひとつ確認して修正していくのは次回で!笑
独自gem作成その1 / bundler
本日からは、独自の gem を作ることを目標にいろいろ学習を進めていきます!
gem についてはこちらの記事で少し触れていますのでご参照ください✨
目次
1.gem 作成前の下準備
独自の gem はまだ思いついていないので、まずはRubyGemsの公式ページを読んでみます。
目次の順番に読んでいき、MAKE YOUR OWN GEM
を読み始めてみると、bundler で gem を作るというリンクがあります💡
ちょっと寄り道してリンク先の bundler のページを見てみると、bundler 1.13で gem を作る解説ページに飛びます👀
私のパソコンにインストールされている bundler のバージョンは 1.17.1 なので、1.17の解説ページを読むことにしました😊
Bundler: How to create a Ruby gem with Bundler
私のパソコンには bundler がいつの間にかインストールされています。というか、過去にインストールした記憶はあるのですが、なぜだったか思い出せません笑
なのでインストール手順は飛ばして、以下のコマンドでバージョンの確認をします。
$ bundler -v
バージョンは 1.17.1 です💡
ちなみに bundler 未インストールの場合、以下のコマンドでインストールできます。
$ gem install bundler
2.bundler で gem を作る練習
2-1. Getting Started
先程の bundler のサイトに gem を作る例が載っているので、まずはそれに従ってやってみます。
bundler で新しく gem を作るには、まず以下のコマンドを実行します。
$ bundler gem 作りたいgem名
ここではfoodie
という名前の gem を作ってみます!
We call our gem foodie because this gem is going to do a couple of things around food, such as portraying them as either “Delicious!” or “Gross!”. Stay tuned.
どうやら food に対してDilicious!
かGross!
のどちらか反応をするための gem っぽいですね🙂
bundler gem foodie
を実行すると、3つの質問をされます。
どれも今は正直分からないので、テストファイルはよく見かけるほうのrspec
にしておいて、それ以外はyes
としておきます。
無事にfoodie
という gem が作れたみたいです!
ホームディレクトリにfoodie
というファイルができたみたいです!これが gem ですね😊
foodie
の中にも様々なファイルが作成されています。
ターミナル操作は大変になってくるので、ここからは必要に応じてVSCodeで作業します😗
2-2. Testing our gem
VSCodeでfoodie
を開いてみると、ファイルが作成されているのがより分かりやすくなります。
次のキャプチャはfoodie
の中のfoodie.gemspec
を開いている様子です。authors や homepage などダミーの文字列が入っていますが、正しく入力しないと進めないので、適当に入力して、飛ばしたいところはコメントアウトしていきます😐笑
次にbundle install
を実行します。ここでエラーがあると、先程のダミーがまだどこかに残っている可能性があります💀
エラー文が丁寧に教えてくれるので、読んだとおりに対処すれば解決は難しくないと思います。
bundlerのページを読み進めていくと、foodie_spec.rb
に書く内容が載っているので、コピペしてみます。
foodie_spec.rb
には元々何か書かれているのでそれはそのままにして、# added by sayaka
以下がコピペ文章になります。
ちなみにコピペそのままだと 17行目でdescribe
が Object に定義されていないというエラーが起きてしまうので、ここは元々書いてあるコードの真似をして冒頭にRSpec.
を付け足しています⛄️
コードを見ると、どうやらブロッコリーが不味いみたいですね😂笑
bundler exec rspec spec
を実行します。
テスト成功です🎉🎉
2-3. Using other gems
続いて、自分の gem から Active Support のpluralize
メソッドを使うとのことですが、なんのこっちゃという感じですね〜🙃
解説を読んだところ、activesupport
という gem を指しているのだと思いますが、pluralize
は今のところ謎です。
それっぽいリンクは見つかりました!笑
Method: String#pluralize — Documentation for activesupport (5.2.1)
今は言われるがままに進めてみましょう💪💪
他の gem を使うには、foodie.gemspec
に使いたい gem を関連付けます。
activesupport
への紐付けをfoodie.gemspec
の44行目に書いてみました。
次に、再びbundle install
を行います。これでactivesupport
という gem がインストールされるはずです✨
実行画面では分からなかったので、gem list
コマンドを実行し、インストール済みの gem 一覧を見てみました。
activesupport
が正しくインストールされていることが確認できました🙂
次はfood_spec.rb
のdescribe Foodie::Food
ブロック内にpluralize
のテストを作成します。
上のキャプチャでいう26〜28行目です!
最後に、doof.rb
の先頭にrequire 'active_support/inflector'
を追加し、food
クラスの中にpluralize
メソッド(14〜16行目)を定義します。
以上で Active Support のpluralize
メソッドが使えるようになったはずなので、テストしてみます!
テストは成功…っぽいですが、pluralizes a word
という出力で合っているんでしょうか…笑
てっきりfoodie.spec.rb
で設定したtomatoes
が出力されると思っていたのですが😐
仕組みがまだ分からない以上なんとも言えませんが、とりあえず本日はここまで!
Rakeの基本
今回はRubyで使える便利なツール、Rakeというものを扱ってみます!
目次
1.Rakeとは
Rubyに限らず、アプリケーションを構築するとき、手順を自動化したりするビルドツールというのがよく使われます💡
有名なビルドツールにMake
というものがあるそうですが、文法が難しいみたいです😨
Rake は Ruby-Make の略で、Rubyの文法で使えるビルドツールです。
以下のサイトの前半が参考になるようですので、見ながらやっていきます👀
ファイルを扱う作業をRakeで便利にしよう!(パート1:概要編) - るびくる&RBのRubyプログラミング大作戦! - rubicle.net
インストールにはgem
を使って# gem install rake
とするのですが、私の場合、RubyGemsをインストールしたときに Rake も一緒にインストールされています。
参考記事:RubyGems
念のため確認してみます!rake --version
を実行すると、インストールされている Rake のバージョンが表示されます🙂
Rakeのバージョン12.3.1
がインストールされていることが分かりました!✨
2.Rakeの使い方
2-1. Ralefileを作る
Rakeを使うには、まずRakefile
という名前のファイルを作成し、その中にRakeを使って実行したい一連の流れをタスクとして定義します。
とりあえず以下の手順で、デスクトップにRakefileを作ってみました!
Ralefileの内容は以下のとおりです。
testfile
という名前のタスクが定義されています。
"Hello Rake world."と書かれたテキストファイルを作るタスクです😶
実行するには、rake testfile
コマンドです!💪
するとデスクトップにhello-world.txt
というファイルが作成され、中にはHello rake World.
と書かれています🎉
このように、RakeはRakefileの中身を解析し、その内容に従ってビルドを進めるということがわかりました!
3.C言語を使ってビルド
C言語で書かれたソースコードを使ってビルドすることもできます👌
と言っても私はC言語を使えないので、gistを拝借します😆😆
知らない方のgistを挨拶無しで使ってしまうことに対して非常に抵抗がありますが、公開されているし…
このあたりのマナーはよく分からないので、IT業界に入ったら身につけていけるのではないかと期待しています笑
このRakefileを実行したら何かが起きるはず!と思ったら、結果は以下のとおりでした。
hello.c
が無いみたいです。これ、gistの1番目にあったC言語のソースコードの名前ですね😐
このファイルが同じディレクトリに無いとだめなんですね!!
当たり前と言われれば当たり前かもしれませんが、C言語読めなかったのでスルーしてしまいました…笑
今度は実行したディレクトリ(私の場合デスクトップ)にhello
とhello.o
というファイルが作成され、ターミナルにも実行結果が現れました😇
ちなみにデスクトップに生まれたhello
とhello.o
の中身は、cat
で見ると文字化けしているようでよく分かりませんでした😗笑
Rakeの使い方は以上です〜!
RubyGems
本日は、RubyGems
というソフトを使ってみます!
Rubyのライブラリを扱うことができるそうで、Ruby on RailsもRubyGemsでパッケージングされているとのこと。早速始めます😊
目次
1.RubyGemsとは
RubyGemsの公式ガイドはこちらです。
今回はこのページに従って進めていきます!英語なので、ざっくりの要約を入れながら進めていきます💪
The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a “gem” which contains a packaged Ruby application or library.
どうやらRubyにはgem
と呼ばれるソフトがあるそうで、Rubygemsは、この gem を使えるようにしてくれるみたいですね。
Gems can be used to extend or modify functionality in Ruby applications. Commonly they’re used to distribute reusable functionality that is shared with other Rubyists for use in their applications and libraries. Some gems provide command line utilities to help automate tasks and speed up your work.
gemというのは、Rubyの機能性を拡張できるものらしく、他の人と共有したりできるみたいです。
なんだかUNIXみたいですね👀
2.gemのインストール
まずgemをインストールします。
INSTALLING GEMSのとおりにインストールしてみます!
$ gem install drip
最後の行に2 gems installed
とあります。
これはdrip
というgemと合わせて、rbtree
というgemも一緒にインストールされているようですね!!🎉
よく見るとrbtree
が先にインストールされて、rbtree
が拡張されてdrip
がインストールされているようですね。
rbtree
とやらが何なのか、公式サイトで検索できました!便利〜😎
rbtree | RubyGems.org | your community gem host
A RBTree is a sorted associative collection that is implemented with a Red-Black Tree. It maps keys to values like a Hash, but maintains its elements in ascending key order. The interface is the almost identical to that of Hash.
rbtree
はRedとBlackのTreeのことで、赤と黒のツリー表示で何かを表している専門用語のようです😪笑
ではdrip
は?というと、以下の解説が書かれています。
Simple RD-Stream for Rinda::TupleSpace lovers.
さっぱり何言ってるか分かりませんね〜😂
RDストリームも Rinda も TupleSpace も、調べてみると深そうなのでとりあえず今は置いておきます。
ひとまず、RubyGems で gem のインストールはできました👏
3.gemの一覧を表示
インストール済みの gem を一覧表示することができます。
gem list
いつの間にか沢山ありますね😳😳最初から入っているのでしょうか。
リモートで gem を探したい時はsearch
を使って検索できます。
gem search キーワード
先程インストールしたdrip
で検索してみました!
他にもいろいろな gem があるのが確認できました💡
4.gemの更新
gemを更新するには、以下のコマンドを実行します。
gem update gem名
gem名を指定しない場合、全部のgemをアップデートします。
私の場合は1分くらい処理をして、アップデートが完了しました👌
ログがすごく長いので、キャプチャは割愛します😆
5.gemのアンインストール
gemをアンインストールするには以下のコマンドを実行します。
gem uninstall gem名
ではdrip
をアンインストールします👋
RubyGemsについては今後使っていくと思いますが、とりあえず導入は以上です!✨
Ruby入門 part11
Ruby入門、標準ライブラリについての続きです🎈
これでRuby入門は最後になります!長かった〜!
この記事もそれなりに長いです😂笑
目次
1.配列(Array)クラス
1-1. 要素の置き換え、追加
配列オブジェクトについてはこちらの記事で学習したとおりですが、インデックスという数値を使って他のオブジェクトを管理できるものでした💡
インデックスは先頭の要素を 0 として、1, 2, 3, ... と増えていくものでした。
そして、配列に含まれる要素を取得するには次のように行います。
1つの要素を取得する方法と、複数の要素を配列として取得する方法を続けて記載いたします。
変数名 = 配列オブジェクト名[インデックス]
新しい配列オブジェクト名 = 配列オブジェクト名[開始位置..終了位置]
また、配列に含まれる要素を別の要素に置き換えることもできます。
配列オブジェクト名[インデックス] = 新しい要素
配列オブジェクト名[開始位置..終了位置] = 新しい要素
配列オブジェクト名[開始位置, 要素の数] = 新しい要素
要素を追加するには、上記の3つめの方法を応用して、引数の「要素の数」を0にすることで、開始位置に新しい要素を追加できます✨
これまでの解説をまとめて実際にやってみました!
gist.github.com
結果は以下のとおりです。
1-2. 配列の平滑化
配列オブジェクトの中の要素に他の配列があるとき、中の配列を展開して平滑化することができます。
Arrayクラスで用意されているflatten
メソッドを使います。
配列オブジェクト名.flatten
具体的には以下のようになります。
ここでは、配列の中のひとつの要素に["塩", "胡椒"]
という配列が入っていますが、これを展開して平滑化しています🌝
gist.github.com
結果は以下のようになります。
1-3. 要素を取り除くメソッド
ここからは要素を取り除くメソッドをいくつか紹介します。
メソッド | 動作 | 備考 |
---|---|---|
uniq | 重複要素を取り除いて配列を作成 | |
uniq! | 重複要素を取り除いて配列を上書き | |
compact | nilの要素を取り除いて配列を作成 | |
compact! | nilの要素を取り除いて配列を上書き | |
delete | 指定した値と等しい要素を取り除いて上書き | 引数あり |
delete_at | 指定したインデックスの要素を取り除いて上書き | 引数あり |
delete_if | ブロック内の処理結果がtrueの要素を取り除いて上書き | 解説後述 |
沢山ありますね!!
delete_if
は、以下のように書くことができます。reject
も同様です😊
配列オブジェクト名.delete_if {|x|
実行する処理
}
uniq
のように新しく配列を作成するメソッドに対して、delete
のように自身を上書きするメソッドを破壊的メソッドといいます。
新しく作成するメソッドなのか、上書きするメソッドなのかを把握しながら実行しないと、予期せぬ戻り値になります笑
ちなみにわたしはdelete
が新規作成メソッドだと思いこんでいたら、取り除きたい値だけが戻り値になって返ってきてしまい、苦戦しました😂
ひとつひとつ試していきます!
結果は以下のとおりです。
1-4. 並び替えメソッド
削除の次は、要素を並び替えるために使えるメソッドを紹介します😋
メソッド | 動作 | 備考 |
---|---|---|
reverse | 要素を逆順に並び替えて配列を作成 | |
reverse! | 要素を逆順に並び替えて配列を上書き | |
sort | 要素を一定の規則でソートして配列を作成 | 解説後述 |
sort! | 要素を一定の規則でソートして配列を上書き | |
transpose | 配列を行列とみなす(行と列を入れ替える) | 解説後述 |
sort
メソッドは、以下のようにブロックを使ってソートする方法を指定することができます。
Arrayオブジェクト.sort {|a, b|
aとbを使った比較の方法
}
なお、比較方式を指定しない場合には各要素を<=>
メソッドが使われます。この場合、要素は小さい順に並べ替えられます。
transpose
メソッドは、配列(左から右へ)を行列(上から下へ)として入れ替えるメソッドです。
行と列が入れ替わるというイメージですね😶
これらを実際に試してみます!
結果は以下のとおりです。
2.ハッシュ(Hash)クラス
ハッシュについてはこちらの記事で学習しましたが、他にもHashクラスで使えるメソッドがあるので紹介します💡
メソッド | 動作 | 備考 |
---|---|---|
delete | 指定したキーに対応する値を取り除いて上書き | 解説後述 |
delete_if | ブロック内の処理結果がtrueのキーと対応する値を取り除いて上書き | 解説後述 |
reject! | 同上 | |
relect | ブロック内の処理結果がtrueのキーと対応する値を取り除いたハッシュを作成 | |
clear | ハッシュを空の状態にする |
先程も出てきたdelete
系のメソッドがHashクラスにも用意されていますね〜😐
指定したキーに対応する値を、ハッシュ自身から取り除きます。破壊的メソッドですね🔥
戻り値は削除された値になります。
delete
メソッドでは、指定したキーが存在しない場合の処理をブロックに指定することもできます!
ハッシュオブジェクト名.delete(キー) {|key|
...
}
delete_if
メソッドは次のように書くことができます。
同じ動作をするreject!
メソッドも同様です👌
ハッシュオブジェクト名.delete_if {|key, value|
...
}
実際にやってみます!
gist.github.com
結果は以下のとおりです。
3.時刻(Time)クラス
3-1. Timeオブジェクトの作成
今度は初登場のTime
クラスです。時刻を扱うクラスですね🕑
Time
クラスから作成できるTime
オブジェクトには、起算時と呼ばれる時刻から現在までの経過秒数を持っています。
起算時は、一般的には1970年1月1日午前0時です。
なぜかというのはちょっと調べてみただけではよく分かりませんでしたが、世界的な基準やらUNIXのシステムやらがそうなっているらしいです😶
Timeオブジェクトを作成するには、おなじみnew
メソッドを使います。
Timeオブジェクトを格納する変数 = Time.new
new
メソッドの他にnow
メソッドを使うこともできます。
Time
クラスには、オブジェクトの経過秒数から時刻を構成する要素を取り出すメソッドがいくつか用意されています。
メソッド | 動作 |
---|---|
sec | 秒を整数で取得 |
min | 分を整数で取得 |
hour | 時を整数で取得 |
day | 日を整数で取得 |
mday | 同上 |
month | 月を整数で取得 |
mon | 同上 |
year | 年を整数で取得 |
wday | 曜日を0(日)から6(土)の整数で取得 |
yday | 1月1日からの通算日を整数で取得 |
isdst | 夏時間があるなら true |
dst? | 同上 |
zone | タイムゾーンを表す文字列を取得 |
沢山ありますね😳
これらを組み合わせてプログラムを書いてみました!
結果は以下のとおりです。
実行した時の時刻が表示されました!🎉
現在時刻ではなく、指定した日時を表すTime
オブジェクトを作成するには、Time
クラスで用意されているlocal
メソッドを使います。また、mktime
メソッドを使っても同じです。
local
メソッド(またはmktime
メソッド)の引数には以下の2種類があります。
Time.local(year, month, day, hour, min, sec, usec)
Time.local(sec, min, hour, day, month, year, wday, yday, isdst, zone)
ひとつめの引数は、年、月、日、時間、…という順で作っていきます。usec
はマイクロ秒のことです😊
途中から省略することもでき、その場合は省略された引数には取り得る最小値が代入されます。
ふたつめの引数は、秒、分、時間、…という順です。
こちらは引数を省略できず全て指定するのですが、wday, yday, zone
は設定しても無視されるようです笑
isdst
はサマータイムの有無を指し、値はtrue
またはfalse
です。
3-2. Timeオブジェクトを文字列として取得
Time
オブジェクトを指定したフォーマットで文字列として取得するには、Time
クラスで用意されているstrftime
メソッドを使います。
変数 = Timeオブジェクト名.strftime(フォーマット文字列)
引数のフォーマット文字列とは、出力したい形式を表す文字列です。以下のような特別な文字列を使って指定することができます。
フォーマット文字列 | 出力形式 | 出力例 |
---|---|---|
%A | 曜日 | Sunday, Monday, ... |
%a | 曜日の省略形 | Sun, Mon, ... |
%B | 月(文字) | January, February, ... |
%b | 月(文字)の省略形 | Jan, Feb, ... |
%c | 日付と時刻 | |
%d | 日 | 01 〜 31 |
%H | 24時間制の時 | 00 〜 23 |
%I | 12時間制の時 | 01 〜 12 |
%j | 年中の通算日 | 001 〜 366 |
%M | 分 | 00 〜 59 |
%m | 月(数字) | 01 〜 12 |
%p | 午前または午後 | AM,PM |
%S | 秒 | 00 〜 60 (60はうるう秒) |
%U | 週番号(最初の日曜日が第1週) | 00 〜 53 |
%W | 週番号(最初の月曜日が第1週) | 00 〜 53 |
%w | 曜日を表す数(日曜日が0) | 0 〜 6 |
%X | 時刻 | |
%x | 日付 | |
%Y | 西暦 | |
%y | 西暦の下2桁 | 00 〜 99 |
%Z | タイムゾーン | |
%% | %自身 |
沢山あって、覚えるのは難しそうですね💦
実際にやってみると、次のようになります。
gist.github.com
結果は以下のとおりです。
3-3. 時刻の取得
Time
クラスには、時刻を取得するためのメソッドがいくつかあります。
メソッド | 動作 | 備考 |
---|---|---|
to_a | Timeオブジェクトの各要素を配列として取得 | 解説後述 |
to_f | 起算時からの経過秒数を浮動小数点数で取得 | |
to_i | 起算時からの経過秒数を整数で取得 | |
tv_sec | 同上 | |
utc_offset | 現在のタイムゾーンと協定世界時との時差を取得 | |
gmt_offset | 同上 | |
gmtoff | 同上 |
to_a
メソッドで取得できる時刻の要素は、次の順番で配列に格納されます。
[sec, min, hour, mday, month, year, wday, yday, isdst, zone]
これらを実際に試してみました!
gist.github.com
結果は以下のとおりです。
4.日付(Date、DateTime)クラス
4-1. Dateクラス
Date
クラスは日付を扱うクラスですが、Ruby公式では推奨されていないらしいです。将来的になくなるとか🧐
Date
クラスは組み込みクラスではないため、Date
クラスを使うにはまずプログラムファイルの中で次の一文を記述する必要があります。
require "date"
Date
クラスのオブジェクトを作成するには、new
メソッドを使って年月日を指定するか、today
メソッドを使って本日の日付を取得する方法があります。
Date.new(year, month, day)
Data.today
Data
クラスのオブジェクトはTime
オブジェクトと同様に、day
メソッドなどを使って時刻を取得したり、フォーマット文字列を使って文字列を取得することができます。
4-2. DateTimeクラス
DateTime
クラスはDate
クラスのサブクラスで、Date
クラスの年月日に加え、時分秒を扱うことができます💡
DateTime
クラスも当然組み込みクラスではないため、始めにプログラムファイルの中でrequire "date"
を記述する必要があります。
DateTime
クラスのオブジェクトを作成するには、new
メソッドで任意の時間を指定するか、now
メソッドで現在の時刻を取得します。
Date.new(year, month, day, hour, min, sec, offset)
DateTime.now([start])
offset
は、協定世界時との時差を指定します。単位は日
です🌞
例えば、日本の時差(9時間)を表すには9[時間] / 24[時間]
日の0.375
日となります。
Ruby入門、以上です!長々ありがとうございました😆
Ruby入門 part10
Ruby入門いよいよラストスパートです!
標準ライブラリのセクションに入りました\(^o^)/
目次
1.標準ライブラリ
Rubyで最初から用意されているクラスやモジュールを標準ライブラリといいます。
項目は公式リファレンスマニュアルのライブラリに載っています😊
docs.ruby-lang.org
2.数値(Numeric)クラス
2-1. 整数(Integer)と浮動小数点数(Float)の変換
Numeric
クラスには、サブクラスとしてInteger
クラスとFloat
クラスがあります。
Numeric は数値、Integer は整数、Float は浮動小数点数でしたね👨🎓
整数と浮動小数点数といっても、数値を指すことには変わりないので、例えば10
と10.0
はお互いに変換することができます。
メソッド | 用途 |
---|---|
to_f | IntegerからFloatに変換 |
to_i | floatからIntegerに変換(小数点以下切り捨て) |
truncate | 同上 |
round | floatからIntegerに変換(四捨五入) |
ceil | floatからIntegerに変換(切り上げ) |
floor | floatからIntegerに変換(切り下げ) |
小数点以下の扱いにもいろいろなパターンがありますね〜🤨
それぞれ試して結果を見てみましょう!!
gist.github.com
結果は以下のとおりです。
ちょっとずつ結果が違うので、用途を考えて変換しなくちゃですね💪
2-2. 数値を文字列に変換
続いては、Integer
クラスで用意されているメソッドを2つ紹介です!
ひとつは数値を文字列に変換するto_s
メソッドです。s
はString
の頭文字ですね。
数値を文字列にするというのは、10
を"10"
にする感じです。数字としての10ではなく、「10」という文字列にするということです。
また引数として、2から36までの基数を指定できます。
例えば10.to_s(2)
なら、10を2進数にした1010
が文字列として返ってきます👏
もうひとつは数値を文字コードに変換するchr
メソッドです。
US-ASCIIでは、1バイトの文字(簡単に言うと半角の文字)は、0 から 255 までの範囲の文字コードに対応しています。
ただし私の使っている環境がUTF-8なので、実際に試すとエラーになります😖
今はNumericクラスの学習がメインなので割愛しますが、UTF-8の文字コードがあれば、文字コード.chr(UTF-8)
という書き方で文字に変換できます😊
数値を文字列にするほうを実際にやってみました!
gist.github.com
結果は以下のとおりです。
2-3. 割り算メソッド
次は、割り算についてのメソッドを紹介します。
四則演算についてはこちらの記事に書いたとおりです。
当時は注意点として、/
を使って割り算をすると、整数÷整数=整数になってしまうことを挙げました🙁
今回は、/
以外の方法で割り算をして、答えが浮動小数点数になるようにしてみます!
割り算をするためにNumeric
クラスに用意されているメソッドとして、div
メソッドとquo
メソッドがあります。
割り算に使われる数値が整数でも浮動小数点でも、div
メソッドは答えを整数で返します。
逆にquo
メソッドの答えは浮動小数点数になります。
割られる数と割る数のパターンに対する結果を以下にまとめました!
- div:割り算の答えは整数
- divmod:割り算の答えを整数と余りで表示
- fdiv:割り算の答えは浮動小数点数
- /:整数同士の割り算の答えは整数、それ以外は浮動小数点数
- quo:割り算の答えは分数
ちなみにメソッドは割られる数.div(割る数)
という書き方になります。割る数は引数ですね🙂
実際にやってみました!
gist.github.com
結果は以下のとおりです。
2-4. 絶対値を取得
最後に、絶対値を取得するabs
メソッドです。
数値.abs
で絶対値を取得します。負の値なら(-5).abs
です💡
これはややこしくないので、キャプチャは割愛しますね😂
3.文字列(String)クラス
3-1. 文字列の大小関係
文字列オブジェクトについてはこちらの記事で扱っていますので、ここではString
クラスについて詳しく見ていきます😎
数値と同じく、文字列にも大小関係があります!
なので==
や!=
の演算子は当然使えますが、>
や=<
も使えます😳
どうやらアルファベットに対応していて、ABCDEF....XYZabcdef...xyz
という順番で大きくなっていくみたいです。
ではひらがな、漢字は?というと…ワカリマセン🤪
文字のバイト数を比較しているようですが、詳しく載っているブログを見つけたので貼っておきます!
いろいろ試してみました。
gist.github.com
結果は以下のとおりになりました!Japan は America より大きい!!\(^o^)/
3-2. 文字列の一部を取得、置き換え
今度は、文字列の一部を取得して、文字を置き換える方法です。
書き方は以下のとおりです。文字で説明するのわかりにくいですが…😖笑
文字列[取得したい文字の先頭位置, 取得したい文字の長さ]
または
文字列[取得したい文字の先頭位置..取得したい文字の最後の位置]
ただし、先頭は0番目として数えます!あと、長さの単位はbyteです。これは注意ですね🖊
例えばHello[1,3]
とすると、Hello
の1番目のe
から始まって3文字の長さであるell
を取得します。
また、Hello[2..4]
とすると、Hello
の2番目から4番目の文字列llo
を取得します。
他には、以下のような書き方もあります。こちらは数え方が少し変わっています。
文字列[取得したい文字が始まる位置...取得したい文字が終わる位置]
文字だけの説明だと全然わからないと思いますが😭頑張って説明してみます。
これは文字と文字の間を数えていく方法で、0番目(先頭)の文字の左隣が0、0番目と1番目の文字の間が1、という数え方です。
例えばWelcome[2...4]
なら、引数の2
は e と l の間を指し、4
は c と o の間を指しています。
つまり、lc
を取得します。
試しにやってみます。
gist.github.com
結果は以下のとおりです✨
3-3. 文字列を挿入、検索
文字列の中に他の文字列を挿入するには、String
クラスで用意されているinsert
メソッドを使います。
insert(挿入する位置, 文字列)
挿入する位置は、先程と同様に先頭の文字が0番目です。
文字列の中から指定の文字列を検索するには、String
クラスで用意されているindex
メソッドを使います。
index(文字列, 検索開始位置)
このうち、検索開始位置は省略できます👌
index
メソッドは、文字列の左端から右端に向かって検索を行います。
また、右端から左端に向かって検索するときは、rindex
メソッドを同じように使います。
いずれのメソッドも、見つかった場合は対象の文字列の左端の位置を返し、見つからなかったらnil
を返します👏
ちなみに、対象の文字列が含まれているかどうかの確認だけならinclude?
メソッドを使います。
include?(文字列)
引数の文字列が含まれていればtrue
、含まれていなければfalse
を返します。
実際にやってみます!
gist.github.com
結果は以下のとおりです。
なんとなくわかってきました〜!
3-4. 文字列を削除、分割
文字列の中に含まれている文字列を削除したい場合は、String
クラスで用意されているdelete
メソッドを使います。
delete(文字列1, 文字列2, ... )
引数には削除したい文字列をカンマで繋げて、複数の文字列を削除できます。
delete
メソッドは、削除した後の文字列を繋げて新しい文字列として保存しますが、delete!
にすると削除した後に上書き保存します。
また、文字列を分割するには、String
クラスで用意されているsplit
メソッドを使います。
split(分割パターン, 分割数)
分割バターンは区切り文字を指定したり、正規表現を使うことができます💪分割数は省略可能です。
分割された文字列は、新しく作られる配列の各要素となります。
削除と分割を実際に試してみました〜!
gist.github.com
結果は以下のとおりです。
引き続き削除メソッドを2つ紹介しますが、サンプルプログラムでは非常にわかりにくいため、文章だけで説明になってしまいますがご了承ください😖😖
ひとつは、既存のファイルから文字列を読み込んだ場合などに、文末の改行文字\n
などをまとめて取り除きたい場面があります。
文字列の最後にある改行文字を取り除くためには、String
クラスで用意されているchomp
メソッドを使います。
もうひとつは、既存のファイルから文字列を読み込んだ場合などに、先頭や末尾の空白をまとめて取り除きたい場面があります。
文字列の先頭や末尾にある空白文字(タブなども)を削除するには、String
クラスで用意されているstrip
メソッドを使います。
本日は以上です✨