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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

2375閲覧

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

slime

総合スコア10

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/01/24 05:18

編集2019/01/24 05:30

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

私の解釈

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

bash

1irb(main):001:0>

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

bash

1irb(main):003:1>

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

bash

1 irb(main):001:0>

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

bash

1irb(main):002:0=

疑問点

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

bash

1irb(main):011:0*

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

bash

1irb(main):004:0/

私が確認した内容

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

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

ruby

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

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

Ruby

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

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

bash

1hiraonoMacBook-Air:~ hirao$ irb 2irb(main):001:0> a = 10 3=> 10 4irb(main):002:0> / 5irb(main):003:0/ a = 20 6irb(main):004:0/ 7irb(main):005:0/ / 8=> / 9a = 20 10 11/ 12irb(main):006:0> a = 30 13=> 30 14irb(main):007:0>

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

bash

1hiraonoMacBook-Air:~ hirao$ irb 2irb(main):001:0> + 3irb(main):002:0* + 4irb(main):003:0* + 5irb(main):004:0* a=10 6=> 10 7irb(main):005:0> - 8irb(main):006:0* 9irb(main):007:0* - 10irb(main):008:0* 11irb(main):009:0* a=10 12=> 10 13irb(main):010:0> * 14irb(main):011:0* 15irb(main):012:0* * 16irb(main):013:0* 17irb(main):014:0* a=10 18Traceback (most recent call last): 19 1: from /usr/local/bin/irb:11:in `<main>' 20SyntaxError ((irb):12: syntax error, unexpected *, expecting '=') 21irb(main):015:0>

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

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

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

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

bash

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

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

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

bash

1hiraonoMacBook-Air:~ hirao$ irb 2irb(main):001:0> =begin 3irb(main):002:0= この部分はコメント 4irb(main):003:0= 何行でも書くことができる 5irb(main):004:0= =end 6irb(main):005:0>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

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

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

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

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

Ruby

1def foo 2 100 3end 4 5p foo #=> 100 と表示 6 7p foo /10 #=> 100÷10で、10と表示されるべきだが、正規表現の途中と見なされ、エラーに

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

投稿2019/01/24 06:17

編集2019/01/24 06:24
otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

slime

2019/01/24 07:18

otnさん 迅速な回答をいただきたいありがとうございます。 とても分かりやすく、かつ見やすかったです。 正直、こんなに早く回答いただけるとは思っていたので驚きました。
otn

2019/01/24 16:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問