プロを目指す人のためのRuby入門
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで:書籍案内|技術評論社
https://gihyo.jp/assets/images/cover/2017/thumb/TH320_9784774193977.jpg
#本 #Rubyを学ぶ
🍒自分用メモ🍒
“自分の手と頭を動かさなければ、プログラミングは学べない” (まえがきより)
G
第1章 本書を読み進める前に
code:index.txt
・第2章 文字列・数値・条件分岐・メソッドの定義
・第3章 テストの自動化
・第4章 配列・繰り返し
・第5章 ハッシュ・シンボル
・第6章 正規表現
・第7章 クラスの作成
・第8章 モジュール
・第9章 例外処理
・第10章 yield・Proc
・第11章 デバッグ技法
抜粋:: 伊藤 淳一 “Software Design plusシリーズ プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで”
【Ruby初心者向け】テキストエディタ、ちゃんと設定できてる?使いこなせてる?チェックリスト10項目 - Qiita
お気に入りのフォント
Ruby 1.9 までは、デフォルトエンコーディングがUS-ASCIIだったため、日本語を使うにはマジックコメント(# encoding: utf-8や# encoding: shift_jis)を書く必要があった
Ruby 2.0からは、デフォルトエンコーディングはUTF-8
第2章 Rubyの基礎を理解する
すべてがオブジェクト
セミコロンで文の区切り、バックスラッシュで文の継続を明示できる
プログラム・文・式
コメント、識別子、予約語
リテラル:プログラムの中に直接記述できる値
ローカル変数
変数を宣言するだけの構文はない(宣言されていない識別子を参照するとエラーになる)
Rubyでは、変数の型が決まっているわけではないため、数値も文字列も同じ変数に代入できるが、理解しづらくなるため避けること
「動的型付言語は使い物にならない」か? - give IT a try
Rubyの多重代入
シングルクオートかダブルクオートか
数値を扱う
数値と文字列は暗黙的に変換されない(String#to_iなどを使う)
少数の計算で発生する丸めの誤差を回避するにはRational(有理数を扱うクラス)を使う
Rubyの真偽値
Rubyの条件式
Rubyのメソッドについて学ぶ
“Rubyではreturnを使わない書き方のほうが主流”
【統一】不必要なreturnは避ける
Rubyの%記法
ヒアドキュメント (行指向文字列リテラル)
code:抜粋
開始ラベル <<識別子' の 識別子' を(""、''、)のいずれかで囲むことで、ヒアドキュメントとなる文字列リテラルの性質は対応する文字列リテラルと同じ扱いになります。
バックスラッシュ記法
文字リテラル
数値リテラル
&&や||の戻り値と評価を終了するタイミング
演算子式
and、or、notは&&、||、!よりも優先順位が低い
&&は||より優先順位が高い
andとorの優先順位は同じ
【統一】論理演算には常に演算子&&と||を使う(andとorは使わない)
式と文
“文のように見えるが実は式」という要素が多い(つまり、やろうと思えば戻り値を活用できる)”
式
式は評価されると値(評価値)が定まり、その値を返します。ただし、return、break, next といったものは値を返しません。これらは評価された時点で制御が移ってしまいます。
ガーベジコレクション(GC)
Ruby用語集 (か)
オブジェクトがどこからも参照されなくなったとき、そのオブジェクトが占めるメモリー領域はガーベジ、つまりゴミと呼ばれる。ガーベジがたまると、やがて新たなオブジェクトが生成できなくなってしまう。そうなる前にゴミを集めてメモリーを解放してやるのがガーベジコレクションである。 GC と略す。
エイリアスメソッド
Rubyには異名同機能のメソッドがある
疑似変数
self、nil、true、false、__FILE__、__LINE__、__ENCODING__
疑似変数の値を変更することはできません。擬似変数へ代入すると文法エラーになります。
Rubyのライブラリを学ぶ
Rubyのrequire、load、require_relativeの違い
Rubyのpメソッド、putsメソッド、printメソッドの違い
Rubyのスタイルガイド
RuboCopについて学ぶ
第3章 テストを自動化する
ハッカー/プログラマーの三大美徳
Rubyのデバッグ方法を学ぶ
Minitestの基本
Rubyをインストールしたら一緒についてくる
Railsの標準テスティングフレームワーク
テストメソッドは必ずtest_で始める(test_fizzbuzzなど)
テストメソッドの中で、検証メソッドを使ってテストする
module Minitest::Assertions
Minitest以外のテスティングフレームワークに RSpec、test-unit などがある
第4章 配列や繰り返し処理を理解する
Rubyの配列を学ぶ
Rubyのブロックを学ぶ
配列を使った繰り返し
ブロック変数のシャドーイングを避ける
ブロック引数の名前をブロックの外にある変数やメソッドの名前と同じにすると、ブロック内ではブロック引数の値が優先して参照される
Ruby: ブロック変数の「シャドウイング」はシャドウイングなのかが気になって調べた(社内勉強会)
配列を扱う便利なメソッド
slect/find_all、reject
find/detect
inject/reduce
values_at
concat (+と違って破壊的変更を行う)
RubyのRange(範囲)を学ぶ
inspect/to_sメソッド
n.to_s(16)とした場合、整数nを16進数表現に変換して返す (hexメソッドはその逆のことができる)
scanメソッド
正規表現にマッチした文字列を配列にして返す
テスト駆動開発の典型的な開発サイクル
code:抜粋
・先にテストを書いて失敗させる。
・テストがパスするような最小限のコードを書く。
・リファクタリングする。
1つのテストをパスさせるために書く仮実装 (ロジックではなく固定の値を返すようなコード) を”Fake IT”と呼ぶ
1つのテストがパスした後に2つ目のテストを追加する手法を「三角測量」と呼ぶ
テスト駆動開発 | Ohmsha
配列の集合演算
和集合|/+/union
差集合-/difference
積集合:&/intersection
Rubyのsplat引数、splat展開
%記法で配列を作る
%w(foo\ bar baz) => ["foo bar", "baz"]
配列を初期化する時の注意点
Rubyにおける mutable と immutable
with_indexメソッド
配列の添え字の開始数を引数で指定できる
配列をブロック引数として渡す場合、ブロック引数を複数定義すると、多重代入のように配列の要素をそれぞれのブロック引数として受け取れる
code:sample.rb
dimensions = [
10, 20,
30, 40,
50, 60,
]
# ブロック引数を()で囲んで、配列の要素を別々の引数として受け取る
dimensions.each_with_index do |(length, width), i|
puts "length: #{length}, width: #{width}, i: #{i}"
end
ブロックローカル変数:ブロック内のみで有効なローカル変数
Ruby用語集 (は)
ブロックの | | の中で、セミコロンの後に識別子を書いて宣言した変数。
File.new/openメソッドなど、繰り返し処理以外のメソッドでもブロックを渡すことがある
Rubyのdo…endと{…}の違い
do...endよりも{...}の方が結びつきが強い
配列の要素をあれこれ操作したくなった時は、既に用意されているメソッドが使えないか、リファレンスマニュアルで探そう
Rubyの繰り返し処理を学ぶ
第5章 ハッシュやシンボルを理解する
Rubyのハッシュを学ぶ
Rubyのシンボルを学ぶ
Rubyのsplat引数、splat展開
ハッシュでよく使うメソッド
ハッシュをメソッドの引数として渡す時の注意点
ハッシュを初期化する時の注意点
メソッド定義における引数の種類とその順番
引数の種類を混在させる時は要注意
代入してからifで存在を確認、をまとめて書く
【統一】分岐の条件部分で=による代入の結果を値として使う場合は、条件全体をかっこ( )で囲むこと
Rubyの&.演算子/ぼっち演算子
第6章 正規表現を理解する
正規表現とは
パターンを指定して、文字を効率よく検索/置換するためのミニ言語
正規表現を学ぶ
Rubyの正規表現を学ぶ
第7章 クラスの作成を理解する
「クラスを使うプログラムと、使わないプログラムの違い」を理解する
ハッシュを使うと、キーをtypoした時にnilが返ってくるのでtypoに気づきにくい
そこで、クラスを作ってデータを入れる
アクセサを使うことで、属性を表す変数名 (ハッシュのキーの代わり) をtypoするとエラーになるので気づける
新しい属性を追加したり、変数の中身を書き換えたりすることを禁止できる
Rubyのオブジェクト、インスタンス、クラスについて学ぶ
クラスは、内部データや、内部データを利用するための独自のメソッドを持たせることができる
データとそのデータに関するメソッドをセットで持つ
クラスは一種の「データ型」
全てのオブジェクトは何らかのクラスに属している
クラスが同じであれば、保持している属性や使えるメソッドは (原則として) 同じになる
継承やミックスインによって、メソッドが上書きされ内容が変わることもある
オブジェクト毎に保持されるデータのことを「オブジェクトの状態(=ステート)」と呼ぶ
オブジェクトに設定したり、オブジェクトから取得できるデータを属性と呼ぶ
Rubyのメソッドについて学ぶ
selfについて学ぶ
Rubyのメソッドの公開レベル/呼び出し制限
Rubyの変数について学ぶ
Rubyの定数について学ぶ
オープンクラス
定義済みのクラスそのものにメソッドを追加したり、メソッドの定義を上書きしたりすることもできます。Rubyのクラスは変更に対してオープンなので、「オープンクラス」と呼ばれることもあります。
モンキーパッチ
外部ライブラリ(gem)に軽微な不具合があったり、微妙に要件に合わない挙動があったりしたときに、モンキーパッチをあてて挙動を変えることがあります。
何でもできるからといって、オープンクラスやモンキーパッチを乱用してはいけない
ダックタイピング
オブジェクトのクラスが何であろうとそのメソッドが呼び出せれば良しとするプログラミングスタイルのことを「ダックタイピング(duck typing)」と呼びます。
“もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである”
第8章 モジュールを理解する
Rubyのモジュール、ミックスインについて学ぶ
第9章 例外処理を理解する
Rubyの例外処理を学ぶ
第10章 yieldとProcを理解する
Rubyのブロックを学ぶ
第11章 Rubyのデバッグ技法を身につける
Rubyのデバッグ方法を学ぶ
トラブルシューティングの方法
エラー発生時のバックトレースを読む
デバッガーを使う
IRB/irbを使う
ログメッセージを読む
公式ドキュメントを読む
Issueを検索する
例)Ruby Issue Tracking System
ライブラリのコードを読む
Method#source_locationを使って、メソッドがどこのファイルで定義されているか確認する
テストコードを書く
エラーを再現させるテストコードを書いてデバッグする
早くコードを修正しようと焦るより「急がば回れ」の精神でテストコードを書く習慣をつける
ネットの情報を参考にする (警戒しながら)
パソコンの前から離れる
誰かに聞く
第12章 Rubyに関するその他のトピック
日付や時刻を扱う
標準ライブラリ
Timeクラス (組み込みライブラリ)
Dateクラス (dateライブラリ)
2038年問題 - Wikipedia
ISO 8601 - Wikipedia
ファイルやディレクトリを扱う
Fileクラス (組み込みライブラリ)
Dirクラス (組み込みライブラリ)
FileUtilsモジュール (fileutilsライブラリ)
Pathnameクラス (pathnameライブラリ)
ファイルの読み書きを行う
csvライブラリ
jsonライブラリ
yamlライブラリ
組み込み定数 (Objectクラスの定数) を使う
ENVオブジェクト:環境変数を扱う
ARGFオブジェクト:コマンドライン引数を扱う
ワンライナーで実行する (-eオプション)
Rubyの起動/コマンドラインオプション
文字列を受け取ってプログラムとして実行する
Kernel.#eval
メソッドを受け取って実行する
Object#send
【Ruby on Rails】sendメソッドのいろんな書き方 - Qiita
便利なツール
presidentbeef/brakeman: A static analysis security vulnerability scanner for Ruby on Rails applications
Rails環境でセキュリティ向上のため、Brakeman gemを導入&脆弱性対策を実施しました - Zeals TECH BLOG
rubocop/rubocop: A Ruby static code analyzer and formatter, based on the community Ruby style guide.
RuboCopについて学ぶ
whitesmith/rubycritic: A Ruby code quality reporter
RubyCriticでコードを採点 | Engineer's Base Camp
Rake (ビルドツール)
rakeライブラリ
ruby/rake: A make-like build utility for Ruby.
ビルドに限らず、何らかのタスクをまとめて実行するのに便利 (テストコードを一括で実行するなど)
RubyとDSL (Domain Specific Language)
「設定ファイルのようなプログラム」「ドキュメントのようなプログラム」が書ける (Gemfile、RakeFileなど)
DSL(ドメイン固有言語)とは - IT用語辞典 e-Words
特定の作業の遂行や問題の解決に特化して設計されたコンピュータ言語
第1回 DSLとは?:今そこにある“DSL”|gihyo.jp … 技術評論社
RubyGemsとは
Bundlerとは
悲観的バージョン演算子 (~>):"マイナーバージョンは上がっても良いがメジャーバージョンは上げたくない"
セマンティック バージョニング 2.0.0 | Semantic Versioning
APIに影響を及ぼさないバグ修正はパッチバージョンを、後方互換性を保ちつつAPIを変更・追加した場合はマイナーバージョンを、後方互換性のないAPIの変更はメジャーバージョンを上げます。
付録
RailsにはRubyを使う時の独自ルールがある
requireやモジュール定義を省略できる (定数の自動読み込み、モジュールの自動作成など)
定数の自動読み込みと再読み込み (Zeitwerk) - Railsガイド
Active SupportによるRuby標準クラスの拡張
Active Support コア拡張機能 - Railsガイド
Railsに関する最新情報をチェックする
Riding Rails https://weblog.rubyonrails.org/
Rails アップグレードガイド - Railsガイド
Railsアプリケーション開発のためには、様々な知識が必要
「アプリケーション設計」「Web技術」「データベース」「セキュリティ」「パフォーマンス」「テスト自動化」「GIt&GitHub」「サーバ運用」など
Ruby on Rails ガイドも参考にする
RubyGems のメンテナンス状況やトレンドを把握する
関連URL
JunichiIto/ruby-book-codes: Sample codes for "プロを目指す人のためのRuby入門" book
「プロを目指す人のためのRuby入門」の効果的な読み方を動画で指南してみました #チェリー本 - give IT a try
技術書、最初から完全に理解するか、頭の中にインデックスを作るか? 〜 #チェリー本 が後半から難しくなる問題を考える - give IT a try
Ruby 3.0で発生する「プロを目指す人のためのRuby入門」との差異について - Qiita