読者です 読者をやめる 読者になる 読者になる

せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【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章は一旦終わり。