質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.06%

Rubyプログラムのirbコマンド実行時の表示について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 829

98hira

score 8

MacPCでRuby学習のためにirbコマンドを使用しているのですが、後述する解釈に相違がないことと、疑問点について回答いただけないでしょうか。

私の解釈

解釈1:「:001:0>」の「001」はirb実行開始してから入力した行数を表している。

irb(main):001:0>

解釈2:「:001:1>」の[:1>」部分の数字は階層を表しており、階層が深くなるほど数字が大きくなることを表している。

irb(main):003:1>

解釈3:末尾が「>」だと入力待ちを表している。

   irb(main):001:0>

解釈4:末尾が「=」だと複数行コメント入力中を表している。

irb(main):002:0=

疑問点

疑問1:末尾が「*」だと何を表している?

irb(main):011:0*

疑問2:末尾が「/」だと何を表している?

irb(main):004:0/ 

私が確認した内容

次のプログラムをRubyファイルとして実行すると問題なく動作する。

しかし、irb上で実行すると5行目の結果が出力されない。

hash = {name: "takashi", score: {english: 46, math: 80, japanese: 90}, age: 15}
sum = 0
hash[:score].each_value{|val| sum += val}
average = sum /hash[:score].length
puts "takashi’s mark totaled #{sum}, the average mark is #{average}"

irb上で動作NGになる原因を調査したところ、4行目の「/」の後に半角スペースがないことが原因だと分かった。

hash = {name: "takashi", score: {english: 46, math: 80, japanese: 90}, age: 15}
sum = 0
hash[:score].each_value{|val| sum += val}
average = sum / hash[:score].length
puts "takashi’s mark totaled #{sum}, the average mark is #{average}"

この現象よりirb上で「/」単体で入力した時の挙動が気になり、試してみたところ次のような結果になった。

hiraonoMacBook-Air:~ hirao$ irb
irb(main):001:0> a = 10
=> 10
irb(main):002:0> /
irb(main):003:0/ a = 20
irb(main):004:0/ 
irb(main):005:0/ /
=> /
a = 20

/
irb(main):006:0> a = 30
=> 30
irb(main):007:0> 

この結果より、「/」がこのような動作になるということは、同じ演算子である「+」「-」「*」でも同じ動作になるのか気になり試してみると、次のような結果になった。

hiraonoMacBook-Air:~ hirao$ irb
irb(main):001:0> +
irb(main):002:0* +
irb(main):003:0* +
irb(main):004:0* a=10
=> 10
irb(main):005:0> -
irb(main):006:0* 
irb(main):007:0* -
irb(main):008:0* 
irb(main):009:0* a=10
=> 10
irb(main):010:0> *
irb(main):011:0* 
irb(main):012:0* *
irb(main):013:0* 
irb(main):014:0* a=10
Traceback (most recent call last):
        1: from /usr/local/bin/irb:11:in `<main>'
SyntaxError ((irb):12: syntax error, unexpected *, expecting '=')
irb(main):015:0> 

末尾が「>」から「*」に変わり、同じ演算子を再度入力しても戻らず「a=10」で改善された。

但し、「*」演算子はSyntacErrorとなってしまった。

因みにifやwhile文を入力すると次のようになる。

尾の「:0>」が「:1>」に変わることで、1回の字下げを表している思われ、この数字は階層が深くなるほど増えていくと解釈している。

hiraonoMacBook-Air:~ hirao$ irb
irb(main):001:0> a = 10
=> 10
irb(main):002:0> if a > 5
irb(main):003:1> puts("a>5")
irb(main):004:1> end
a>5
=> nil
irb(main):005:0> 

また、復習行コメントの場合は次のような表示なる。

これは、末尾が「=」に変わりコメント記載中であることを表していると解釈している。

hiraonoMacBook-Air:~ hirao$ irb
irb(main):001:0> =begin
irb(main):002:0= この部分はコメント
irb(main):003:0= 何行でも書くことができる
irb(main):004:0= =end
irb(main):005:0> 
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

疑問1:末尾が「*」だと何を表している?

行が継続中である事を示します。a=でEnterしたようなケース。次の行で0とか入れると行が完結する。

疑問2:末尾が「/」だと何を表している?

正規表現リテラルの途中である事を示します。"'も文字列リテラルの途中です。
(この場合、/は演算子じゃないです)

irb上で動作NGになる原因を調査したところ、4行目の「/」の後に半角スペースがないことが原因だと分かった。 

これは、foo /barが、「foo割るbar」なのか、「fooというメソッドを正規表現リテラルを引数にして呼び出している(正規表現リテラルが未完結)」なのか、の判断を間違っています。
rubyコマンドだと、fooが変数である事がわかるので後者ではあり得ず、正しく解釈できますが、irbだとそういう判断ができないのでしょう。

解釈1~4は良いと思います。

 

ちょっと思いついて、下記のプログラムをrubyコマンドで実行してみましたが、解釈を間違いますね。

def foo
    100
end

p foo #=> 100 と表示

p foo /10 #=> 100÷10で、10と表示されるべきだが、正規表現の途中と見なされ、エラーに


仕様なのか、バグなのか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/24 16:18

    otnさん
    迅速な回答をいただきたいありがとうございます。
    とても分かりやすく、かつ見やすかったです。

    正直、こんなに早く回答いただけるとは思っていたので驚きました。

    キャンセル

  • 2019/01/25 01:43

    sum /hash[:score].length
    のように、/の前に空白があり、/の後に空白が無い場合は、正規表現リテラルとみなされる仕様のようです。
    空白を入れるか入れないかを統一すれば除算演算子になるようです。
    sum/hash[:score].length
    sum / hash[:score].length
    普通のコーディングだと、統一しますよね。irbだと手が滑ることもあるでしょう。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る