【Ruby】パーフェクトRuby 学習感想文 ~第15章 その7
それでは15章を読んでいきます。
(参考・経緯など)
パーフェクトRuby 学習感想文 ~はじめに
P574 の実行結果が違う
P559にはこう実装されている↓
opt.on_head('-v','--version', 'show ver') do |v| opt.version = TodoSamp::VERSION puts opt.ver + "dayo" exit end
■自分の実行結果
$ todo_samp -v todo_samp 1.0.0dayo exit
■本の実行結果(P574)
$ todo -v todo 1.0.0
何で「exit」って表示されてしまうのだろう?
ためしに、コードからexit の行を抜く。
gemパッケージ化は手間なので、bundle exec で実行
$ bundle exec ruby bin/todo_samp -v todo_samp 1.0.0dayo '' is not todo sub command.
エラーになった。
なるほど。exit しないと、「-v」コマンドの後も
コマンドを見に行って、ないよーってエラーになるんだ。
「-v」コマンドは他のコマンドと併用して使う想定はないって事か。
学習感想文~第15章その4で、
「-v」コマンドに登録されてるブロック内に、何でexit のコードがあるの???
cp = OptionParser.new do |opt| opt.on_head('-v','--version', 'show ver') do |v| opt.version = TodoSamp::VERSION puts opt.ver + "dayo" exit ←これ end end
って騒いでいたけど、「-v」コマンドは他のコマンドと併用して使う想定はないから、か。
でも、cp(本ではcommand_parser)が解析できる引数は「-v」「-h」の2種類。
これはどっちもブロック内にexitコードが記述されてる。
つまり今の段階では、
「command_parserが解析できる引数」と
「command_parserが解析できない引数(=サブコマンド)」を一緒に使う挙動は想定してないのか。
だって「command_parserが解析できる引数」を指定すると、処理を抜けちゃうからね。
だとすると、parse!メソッド内、
begin cp.order!(argv) options[:command] = argv.shift sub_cps[options[:command]].parse!(argv)
のcp.order!(argv) は、
order!の再帰性(= 解析できない引数までは解析し続ける)は
特に活用していないのか。
なぜ「exit」と標準出力されるのかは謎だけれど
exit のある理由が分かったから良し。。
gemって不思議
15章の最後は、作ったサンプルをgemパッケージ化する。
できたぞー。わーい。
じゃなくて、なんでgemをインストールすると、
コマンドプロンプトにgem名を直接打つだけで、実行できちゃうんだろう。
C:\>todo_samp -v todo_samp 1.0.0dayo exit
通常のメソッドだと、そうは行かない↓
C:\>p "hoge" 'p' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 C:\>ruby -e "p 'hoge'" "hoge"
当然だ。
インストールコマンド↓で、一体何をやっているんだろう。
$ bundle exec rake install todo_samp 1.0.0 built to pkg/todo_samp-1.0.0.gem. todo_samp (1.0.0) installed.
実はこんなことを気にかけているのも、bundleパッケージを使うときに
実行方法が分からずさんざんエラーだったんだよね。
C:\>ruby bundle hogehoge・・・
って書いて、実行できないーって嵌ってた。
いま、エラーが出たときの学習記録見てみたけど、
その記録は残していなかった。
あまりに初歩的で恥ずかしかったからか。。
でも改めて不思議だよ。
ちょっと詳しく見てみよう。
15章は一旦終わり。