yarbの日記スマートフォン用の表示で見るyarbの日記この広告は、90日以上更新していないブログに表示しています。codereadingしつこく「Hub」を眺めている。語学学習に精読と多読の2つのアプローチがあるように、コードリーディングにも精読というのがあるはずで、試しにそれをやってみている。モヤッする「分かってない感」を感じたら、基本的に分かるまで調べるのが精読。そのためには、ブログエントリとして分かったことを書き出すのは良い方法のような気がしたのでやってみている。ほとんど誰も読んでないブログだとはいえ、アウトプットの形にするのは手間だし、何だか気分的には常に挫けそうなんだけど、「なんとなく分かった気になる」という厄介な悪癖を変えるには十分に時間に見合うと思う。やってみて分かったけど、RubyのこともRubyのイディオムのことも、まるで分かってないということが良く分かった。「コードを読む」ということが何かも分かってなかったなと思った。なんとなく眺めてちゃ駄目だな。そのうち多読ができればいいなと思っている。コードを読むのは思ったよりずっと楽しい。理解できないところは「面倒だな」と感じるのだけど、まあ調べれば大抵分かる。やってイディオムや、コードのまとめ方、ライブラリの使い方を調べるのってプログラミング学習の王道なんだろうなと思った。今まで何をやっていたのだと思うようになった。これと同じ事をRuby以外の言語でもやりたい。gitコマンドを実行して結果をキャッシュしたり設定を読み出すためのクラス。頭からつらつら読んでいって、最初から意味が分からないところがあった。end%xはプロセスをフォークして子プロセスとしてコマンドなどを実行する。バックティックで文字列を囲んでも同じ。あるけど、こちらは戻り値がtrue/falseであってコマンドの出力は取れない。GitReaderでは、%xを使ってエラー出力をNULLに捨てつつ結果をchompしてresultに入れている。それはいいけど、「$?.success?」ってなんだ?Ruby(などのスクリプト言語)の特殊な記号ってググるのが難しい。それらしいページが出てきたと思ったら主に使われる記号類のリストとかで「$?」が出てなかったりする。いうとき手元にちゃんとドキュメントを入れておくんだったとか、公式ドキュメントにブックマークしておくんだったと思ったりする。今回気付いたけど、特殊記号を調べる簡単な方法は、Rubyに標準で添付されているenglish.rbを見ることかも。english.rbは以下のようにずらずらとエイリアスを付けるライブラリだけど、ドキュメント代わりにも使える。$=ということで、「$?」は子プロセスの終了コードを保持していることが分かった。Process::Statusということで、Process::Statusのインスタンスだと分かる。POSIXではプロセスのステータスを16ビットの数値で保持していて、それをカプセル化しているインスタンスらしい。いうものがあるのも知った。executableと書くことの違い。executableは、gitコマンドの文字列が入る。設定されていれば、それを優先する。なることはないのだし、ここは引数にデフォルト値を書いたほうがストレートな気がする。同様に、read_procを外から渡せるようにしている理由もよく分からない。するためにこうしているような気がするけど、ここはこれ以上は追わない。面白いと思ったのがハッシュのコンストラクタにlambdaを渡す用法。デフォルト値を渡せる。存在しないkeyでアクセスしようとすると、このデフォルトの値が返ってくる。"b"]デフォルトオブジェクトが書き換え可能というのにちょっと驚いた。Rubyっぽい柔らかさだ。callableオブジェクトも渡せる。すると、存在しないkeyでアクセスしようとすると、このブロックが起動される。このときブロック変数として、そのハッシュそのものとkeyが渡る。これを使うと以下のように何らかのコンピュテーションなりIO処理なりの実行結果をキャッシュするような機構が手軽に実現できる。初期化が以下のようになっている。hashそのものである@dataへの参照が渡される。hostのほうはアクセスしようとしたkeyのオブジェクトが渡る。FileStore#getと#setでアクセスする@dataのデータ表現はハッシュだけど、中身はホスト名を表すkeyに対して常に配列になっているということだ。Hub::Context::GitReaderで次に面白いなと思ったのは、APIの晒し方。実際にgitコマンドの出力を、コマンドを実行したりキャッシュしたりしつつ返すのはGitReader#readというメソッドだけど、これは、以下のように別名を付けられている。いうオブジェクトにreadというメッセージを送ることと委譲が定義されているgit_readerはGitReaderのインスタンスgit_commandはprivateGitReaderMethodsはコードの読み手に「ここに列挙しておきますよ」と伝える役割りかな。git_commandがprivateなのは、gitコマンド関連で情報や設定の読み出しの操作は全てGitReader内で完結していて、対応するメソッドが存在するはずだし、今後何か拡張するとしても、GitReader内にメソッドを足して、そこで直接git_commandを実行せよ、という設計ガイドラインみたいなもんだろうか。あいや......、違うな。git_readerは、以下のようにLocalRepoの初期化時に投げ込まれている。GitReaderMethodsのようにモジュールを切り出すのは再利用のためと、テストの書きやすさのためもあるのかな。読むgit/GitHubを便利に使うHubを少し読む(3)ビットシフトでRubyでも2^n倍の掛け算割り算は速くなるgit/GitHubを便利に使うHubを少し読む月別アーカイブはてなブログをはじめよう!yarbさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。