学習記録 (2月6日 )
<作業と学んだこと>
ボウリング課題コード解説
メソッドの複数の引数が別々の箇所に参照されている。
def add_bonus(rolls, following_pinfalls) if strike?(rolls) following_pinfalls.first(2).sum elsif spare?(rolls) following_pinfalls.first else 0 end end
様々な式が入っているが、最終的に出力する値として最後に変数を記述され、.sumされている。
def calc_score(pinfall_text) pinfalls = parse_pinfall_text(pinfall_text) frames = [] pinfalls.each_with_index.sum do |pinfall, index| frames << [] if next_frame?(frames) rolls = frames.last rolls << pinfall following_pinfalls = pinfalls[index.succ..] last_frame?(frames) ? pinfall : pinfall + add_bonus(rolls, following_pinfalls) end end
すごいなー、数列を変えずにそのまま足しておしまい。
全部順に足していけばいいけれど、rolls(直近のフレーム)によって動きが変わる。それを一気に配列から新しい配列に流し込む。
add bonus、終わったフレーム
と終わっていないのフレーム
の間で投球の加点計算している。メソッドの中に定義した変数をその中に呼び出したメソッドに代入している。配列を別の形の配列に作り変えるメソッドを作る、ということがカレンダー、ボーリング、lsそれぞれのプラクティス共通していた。
メインのメソッドとそれに付随するメソッド、という構造という形式。 lsメソッドの参考にさせていただきました。
学んだこと
ボウリング課題メンター提出コード学習 その2 - succメソッド : 与えた値の次の値。+1
- 組み込みライブラリの中にクラスやモジュールが含まれる
- const_getメソッド : nameで指定されている定数の値を取り出す。
module Bar BAR = 1 end class Object include Bar end p Object.const_get(:BAR) #=>1
モジュールとクラスの関係 クラスやモジュールのネストは::
で表現される。
module Parent class Child end end # Parent.class #=> Module # Parent::Child.class #=> Class
defined?(クラス名/モジュール名)
メソッドでtrueであれば"constant"
が戻る。クラスやモジュールが定義された時、Objectクラスにコンスタント(定数)が追加され、定義されたクラスあるいはモジュールのクラスインスタンスが値として格納される。
ボーリング課題、メンター提出物のメソッド定義のやり方を参考に、ls課題を改善。
dupメソッド(:instance method Objecct#clone) オブジェクトを複製して返す
object_copy = object_original.dup
複製されたオブジェクトは新しいIdを保つため、複製元の変更の影響を受けない(代入による新しい変数は影響を受ける。=オブジェクトid共有)- clearメソッド:(instance methos Array#clear): 配列の要素を空にする
- ||= 演算子 a||=b a||(a=b) aが未設定 or falseの時にbを代入 "数値が存在すればそれ、なければ代入"ができる
frame, next_frame, after_next_frame = frames.slice(n, 3)
配列名を複数用意し、sliceの戻り値をそれぞれに代入- fetchメソッド:(instance method Array#fetch) ハッシュに対してはキーを渡して値を取得 a = [1,2,3] a[0]とa.fetch(0)は同じ
HTTP関連 - 仮装ホスト:同じサーバの中に仮装のホストを設定し、別コンテンツを設置する - クロスサイトスクリプティング,SQLインジェクション - MacOSからtelneを使う。homebrewでインストール - GET / HTTP/1.1 - HOST : www.example.com - はブラウザに www.example.comと入力したのとほぼ同じ - まずは open www.example.com それにくわえてHTTPリクエスト。 - メソッドの後のURIはURLの中の絶対パス以降の部分。 - GETメソッドは最後に改行のみを送ることで、HTTPリクエストが終了となる