- ベストアンサー
Ruby の記号 $? の意味を教えて
次のようなソースコードですが、 cmd = "ls -l" system(cmd) if $?.exitstatus == 1 $? の意味がよく分からないのです。 教えて頂けるでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>Rubyの本に、「$」はグローバル変数の指定として、次のような複数の扱い方があります。 本の名前が書いてありませんが、入門書ですかね。入門書には全部書いてないことも多いですよ。 わからないことがあったらマニュアルを見る習慣をつけましょう。 マニュアルの $? の説明部分には、$? には、nilもしくはProcess::Status 型のオブジェクトが入っていると書いてあります。 従って、$? の使い方はマニュアルのProcess::Statusのクラスの説明の所を見てください。
その他の回答 (3)
- kmee
- ベストアンサー率55% (1857/3366)
そういうことでしたら $で始まるものはグローバル変数なのですが、最初から定義されている特殊変数というものがあります。$?もその一つで、他にもあります。これらはいろんな情報を参照したり設定したりするものです。 今後も出てくると思うので、先程のサイトなどで確認するとよいです。
補足
Rubyの本に、「$」はグローバル変数の指定として、次のような複数の扱い方があります。 1) 文字列処理関連: 「$_」、「$<」、「$.」、「$/」、「$\」、「$,」、「$;」、「$F」、 2) パタンマッチング関連: 「$~」、「$&」、「$'」、「$+」、 3) コマンドライン関連 「$-a」、「$-i」、「$-l」、「$-p」、「$-W」、 しかし、「$?」だけの説明は今まで見つからなかったのです。 恐らく直前の処理を指していると思います。どのように定義されているか、正しい使い方を知りたくて質問に出したのです。
- boingboing
- ベストアンサー率50% (8/16)
これは、shellスクリプト等を触っていればよく出てくるし、それ以外でもよくある話なのですが、あるプログラムが終了すると、それが正常終了したか、異常終了したか終了後にほかのプログラムに知らせるリターンコードっていうのがあります。 まず最初に、cmdには"ls -l"がはいってます。 こいつを、systemつまり、OSに食わせるわけです(厳密にはちょっと違うと思いますがね。この説明)。 で、そいつが正常終了すれば、0。異常終了すれば0以外を返します。 …ふつうは。 ふつうはそういう設計になっているはずです。 歴史的に、正常終了は0なのです。 もしそれの由来とかどなたかご存じでしたらお教えねがいたいんですが。 ともかく、異常終了したら、1が返ってくる場合が殆どです。 これを条件のif文で分岐させるんです。
お礼
ご丁寧に解説していただいて有難うございます。 「$?.exitstatus」は system(cmd) 実行の戻り値ですね。 しかし、「$?」はどのように定義されたのでしょうか。 $?.exitstatus の他に、使い方の例を教えて頂けたら助かります。
- kmee
- ベストアンサー率55% (1857/3366)
http://doc.ruby-lang.org/ja/ http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fvariables.html#builtin http://doc.ruby-lang.org/ja/1.9.3/class/Kernel.html#V_--3F マニュアルに明記されていますが、これらを読んだ上で分からないのでしょうか?
お礼
Rubyは最近から他人のコードを読みながら勉強しています。 分からない時はマニュアルを探しながら理解しています。 教えてもらったリンクは初めて見た「$?」のページです。 有難うございました。
お礼
ご教示頂き有難うございました。