3章はRailsの概念的なアーキテクチャだったので省略
4章を通じてRubyの不明確だった部分のイデオムを復習してみます。
1.配列とハッシュ
配列とハッシュはインデックス付きのコレクション
■配列の書き方
a = [1, 'cat', 3.14] a[0] a[2] = nil # 設定後の配列 [1, 'cat', nil]
複数の型を混在させて格納できる。
nilはnullオブジェクト。オブジェクトなのでnull pointer exceptionを発生させない。
a = ['cat', 'dog', 'duck'] # 次のようにも指定可能 a = %w[cat dog duck] a = [1, 'cat', 3.14] #初期化後の配列 ["1", "cat", "3.14"]
ただし、挿入は文字列に限られる。すべて文字列として認識される。
■ハッシュの書き方
inst_section = { #左側がkey、右側がvalue :cello => '弦楽器' :clarinet => '木管楽器' :drum => '打楽器' }
■指と目に優しい異なるハッシュの書き方
inst_section = { #左がハッシュの場合のみ使用可能な記法 cello: '弦楽器' clarinet: '木管楽器' drum: '打楽器' }
■ハッシュへのアクセス方法
inst_section[:clarinet] #=> '木管楽器' inst_section[:bassoon] #=> nil
■メソッドの最後のパラメータにハッシュを使用した場合のカッコの省略記法
#redirect_to()へハッシュパラメータを代入 redirect_to action: 'show', id: product.id
java屋さんとしては、しっかり抑えておきたい記法。
カッコがないと途端に理解できなくなるのでw
4.3 ロジック
■ブロック
処理をひとまとまりにした記述
#中括弧を使った書き方 { puts "Hello" } # do endを使った書き方 do club.enroll(person) person.socialize end
■ブロックをパラメータとして受け取る方法
def wrap &b 3.times(&b) print "\n" end wrap { print ”ほー”} # 結果:ほーほーほー
4.4 組織構造
class #クラスメソッド def self.find selef.where('paid = 0' ) end #インスタンスメソッド def plus( num ) sum += num sum end end
class Greeter attr_accessor :name #読み書き用メソッド作成 attr_reader :greeting #読み込み用メソッド作成 attr_writer :age #書き込み用メソッド作成
rubyが得意なメタプログラミングでメソッドを生成しているのかな。。気になる。
インスタンスメソッドはデフォルトはpublicとなる。
protected,privateにしたいときはメソッド定義の直前に明示する。
モジュール
■概要
・メソッド、定数、クラスなどをまとめたクラスのようなもの
・オブジェクト生成はできない
・他のクラスへ機能の委譲を行うのに使う
■使い方
モジュールを他のクラスへ「mix int」としてクラスへインクルード。
モジュール内のインスタンスメソッドがクラス内に定義されているがごとく使用可能となる。
module StoreHelper def capitalize_words(String) string.split(' ').map {|word| word.capitalize}.join('') end end
中括弧に対してドット「.」でつなげるとか、慣れないっす。
ブロックもオブジェクトを返却するためか。
この場合は先頭大文字のstringを区切り文字なしでつなげていると思われる。
4.5 オブジェクトのマーシャリング
マーシャリングって聞き慣れない。。
■概要
・オブジェクトをバイトストリームへ変換し、アプリ外部へ保存すること
・保存オブジェクトはアプリ内のインスタンスに読み込みが可能
・注意点が二つ。一部のオブジェクトは保存できない。オブジェクトロード時に
そのオブジェクトのクラス定義をRubyが知っていないといけない。
あまり良くわからないが、ヘーなるほどレベルに止める
4.6 総仕上げ
class CreateProducts < ActiveRecord::Migration def change create_table :products do |t| t.string :title t.text :description t.string :image_url t.decimal :price, precision: 8, scale: 2 t.timestamps end end end
■全体概要
・ActiveRecordモジュールのMigrationクラスを継承
・chageというメソッドを作成
・内部でMigrationクラスのcreate_tableというクラスメソッドを呼び出す。
■create_tableメソッド
・create_tableの引数に:productsというハッシュのテーブル名を渡す。
ハッシュのため、引数の括弧が省略されている
・内部にtというテーブルのフィールド定義用オブジェクトが内部に渡される。
・tオブジェクト内の各メソッドでフィールド定義(string,text,decimalはメソッド)
・各メソッドには例によってハッシュパラメータが渡されているため、括弧が省略されている。
パラメータにハッシュ渡すの書き方が括弧なしなので
好まれる書き方なのかな。Javaやっている人間がぱっと読むとわからなくなりそう。
長くなりましたが、4章完了。
次回から本格的にアプリケーションの構築を開始します。