- ryamakuchi
- 546
- 1
- 0
- 0
さて、休憩終わってセッション聞く。「Good to know YAML」 #heiseirubykaigiB
2019-12-14 16:20:55YAMLのAST周りをざっくり話して、実世界でAST理解してると便利な話をする。55枚あるので駆け足で進める。 #heiseirubykaigiB
2019-12-14 16:21:30psych gem。YAMLのバックエンドライブラリ(Ruby 1.9.3から標準化) github.com/ruby/psych #heiseirubykaigiB
2019-12-14 16:22:19Psych::Nodes::StreamがASTのルートノード。子ノードが1個以上、かつ Psych::Nodes::Documentオブジェクト。 #heiseirubykaigiB
2019-12-14 16:23:32Psych::Nodes::Document はルートの子ノードで、Sequence, Mapping, Scalarのいずれか。 #heiseirubykaigiB
2019-12-14 16:24:23MappingはRubyでいうMap。子ノードの数は必ず偶数個(重要)。子ノードはSequence, Mapping, Scalar、Aliasのいずれか。 #heiseirubykaigiB
2019-12-14 16:25:15Scalarは葉ノードにあたり、子要素を持たない。Sequenceは配列。AliasはASTの葉ノードで子ノードを持たないが、anchorで別のYAML要素を指す。 #heiseirubykaigiB
2019-12-14 16:26:26YAMLを実際に解釈するときはstart_stream、start_documentなどが対応する要素ごとに呼ばれて、ASTノードに変換される。Mappingはkeyとvalueがそれぞれペアになって順に子ノードに入る #heiseirubykaigiB
2019-12-14 16:28:20実用例。重複したkeyを持つyamlファイルの検出。YAML.load_fileすると消えてしまう。案1. end_mappingをモンキーパッチして重複キーを検証する。動くが影響が大きい #heiseirubykaigiB
2019-12-14 16:30:18案2、Psych::TreeBuilderを指定する。これでもいける。案3、ASTから頑張る(これがメイン)(案2のほうがスマートなので実用的にはそちらのほうが良いが、ASTの理解のために頑張ってみる) #heiseirubykaigiB
2019-12-14 16:31:26#heiseirubykaigi #heiseirubykaigiB pic.twitter.com/e3QX1PwaIg
2019-12-14 16:32:24「yamcha gem。サイバイマンに負けるほど弱い」 発想好きだわw github.com/MITSUBOSHI/yam… #heiseirubykaigiB
2019-12-14 16:32:45継承元でのメソッド定義を矯正したい場合はやっぱりNotImplementErrorをraiseするのがいいのか(本題ではない) #heiseirubykaigib
2019-12-14 16:33:48ノード2つの組み合わせで処理分けてるのか… めっちゃ頑張ってるな… #heiseirubykaigiB
2019-12-14 16:35:36