昨日よりrubyプログラムを書いています。
require_relative
呼び出し後にインスタンス変数の初期化が必要か、メソッドの呼び出しは同じファイル上にある場合と同様で良いのか気になり、スコープを確認しました。
module function Kernel.#require_relative
ローカル変数はファイル間では共有されません。ですので、ロードしたライブラリのローカル変数をロード元のスクリプトから直接取得することはできません。
module function Kernel.#require
require(feature) -> bool
feature が絶対パスのときは feature からロードします。 feature が相対パスのときは組み込み変数 $: に示されるパスを順番に探し、最初に見付かったファイルをロードします。
安易に双方向にrequireを記述してしまい、定数定義が重複しているとの警告が出てしまっていました。
双方向の依存性が発生する(双方で関連付けがないと成り立たない)ようなライブラリの関係性は好ましくないです。
いずれか一方で読み込むのみで足りるようにメソッドを組む必要があります。
今回ファイルごとの役割は定まっていたので、require_relative の修正のみで解消しました。
filter_map
各要素に対してブロックを評価した値のうち、真であった値の配列を返します。
戻り値はEnumerator。
Ruby 3.2 リファレンスマニュアル filter_map {|item| ... }
正規表現
今回は以下の正規表現を使って希望の形となるようデータを整形しました。
add_0_after_markX = input_marks.gsub(/X/, 'X,0')
「X」を「X,0」に変換するコードです。
gsub は、文字列中で pattern にマッチする部分全てを文字列 replace で置き換えた文字列を生成して返します。
Ruby 3.2 リファレンスマニュアル Rubygsub(pattern, replace) -> String
次に作成したのは以下。こちらについては追って復習予定。
modified_scores = add_0_after_markX.gsub(/(?<=.{18})X0/, 'X')
メソッド名について
クラス図を書いてみると、プログラム全体を俯瞰的に見ることができました。
・そのクラスにそのふるまいをもたせることは適切か
・メソッド名や変数名が適切か
見直すきっかけになりました。
メソッド名については、言葉を正確に選べるようなるべく意味を調べることにしています。
今回はメソッド名に使っていたscoreとpoint、どちらかに統一したくなったので意味を確認しました。
JavaScript入門
JavaScript入門をよみます。
JavaScriptとは
クライアント側(主にブラウザ)で実行されるオブジェクト指向型のスクリプト言語。
script要素
JavaScript のコードはHTMLファイルに直接記述することができます。
script要素はHTMLファイルの中のhead要素内、もしくはbody要素内に記述します。
必要に応じてどちらか判断します。
JavaScriptのコードをHTMLファイルのどこに記述するべきなのか
HTMlファイルと分けて別にjs用のファイルを用意することもできます。
その場合はscript要素の記述は不要です。
拡張子は.jsにするのが一般的です。
jsファイル作成後は、HTMLファイル内でコードを読み込みたい位置に以下を記述します。
※src (source) 属性←パスを入れる。
jsファイルとHTMLファイルで使用している文字コードが異なる場合は、HTML側でjsファイルの文字コードを指定し読み込むことができます。
ファイルを作成して挙動を確かめながら読み進めるのは楽しいです。
JSが無効のときにコンテンツを表示させる
noscript要素を使います。
中にはHTML文を記述します(jsではありません)。
script要素のすぐ下に置くのが良いように思われます。
defer属性
script要素が持つ論理属性です。
defer 属性の付いたスクリプトは、スクリプトが読み込まれて評価が完了するまで、DOMContentLoaded イベントの発生が抑制されます。
自分の言葉ですぐ説明できない言葉は調べていきます。
パース(parse)
「解析する」の意味をもつ英単語。
データの解析や、解析後に表示可能なデータ構造に変換することなどをさします。
HTMLファイルはダウンロード後にパースされます。
そこに外部ファイルが指定されたscript要素が含まれている場合は、HTMLファイルのパースより優先して行われます。
外部ファイルの読み込み後には、HTMLパースが再開されます。
なお、defer属性が設定されていると、jsの外部ファイルの読み込み中もHTMLパースは中断されることなく実行されます。
(画面表示の遅延等を防ぐことができる。)
async属性
jsファイルの読み込みでHTMLパースと画面表示の遅延が起きなくなることはdefer属性と同じです。
相違しているのは、scriptタグで読み込まれたタグの実行タイミング。
ここはDOMを学んだあと再度確認しようと思います。