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

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

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

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

Q&A

解決済

3回答

1881閲覧

Ruby標準入力から渡した値に関するinclude?メソッドの返却値

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2014/10/04 07:05

以下のコードに関して、ソース上で値を渡した場合と、標準入力から同じ値を渡した場合の"include?"の返却値が異なります。どのような理由でこのような挙動になる理由を教えて下さい。
ファイル名はstdin_test.rb です。

lang

1number = "304" 2 3included_number = "3" 4 5p number.include?(included_number) 6 7included_number_stdin = gets.to_s # 標準入力から3を渡す 8 9p number.include?(included_number_stdin)

出力結果
#########################################
$ ruby stdin_test.rb
true
3
false
$
#########################################

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

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

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

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

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

guest

回答3

0

ベストアンサー

代入の後でp included_number_stdinとすればわかると思いますが、included_number_stdin には、3と改行が入っています。

lang

1included_number_stdin = gets.chomp 2または 3included_number_stdin = gets.strip

としてください。

また、getsはStringなのでto_sは不要です。

投稿2014/10/04 08:17

otn

総合スコア84421

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

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

退会済みユーザー

退会済みユーザー

2014/10/04 11:42

ご回答だけでなく、to_sが不要という指摘ありがとうございます。最初に答えて頂いたということで、ベストアンサーにさせて頂きます。
guest

0

ステップ実行して値を調べれば、自力で解析できるようになります。
ここでは pry という 機能をつかっての debug 方法を紹介します。

  1. $ gem install pry

を実行して、 pry を install します。
2. ソースコードを次のように書き換えます。(pry をロードする、ブレークさせたい箇所に binding.pry と書く)

lang

1require 'pry' 2 3number = "304" 4included_number = "3" 5 6p number.include?(included_number) 7 8included_number_stdin = gets.to_s # 標準入力から3を渡す 9binding.pry 10p number.include?(included_number_stdin)

3 プログラムを実行します。以下にデバッグを開始して、終了するまでの画面を示します。

$ ruby stdin_test.rb true 3 Frame number: 0/5 From: /private/tmp/stdin_test.rb @ line 10 : 5: included_number = "3" 6: 7: p number.include?(included_number) 8: 9: included_number_stdin = gets.to_s # 標準入力から3を渡す => 10: binding.pry 11: p number.include?(included_number_stdin) [1] pry(main)> included_number => "3" [2] pry(main)> included_number_stdin => "3\n" [3] pry(main)> number.include?(included_number) => true [4] pry(main)> number.include?(included_number_stdin) => false [5] pry(main)> exit false $

3 行目の 3 は stdin からの入力待ちに対して 3 を入力したものです。
pry(main)> の行が デバッガの入力待ちの部分です。
変数名を指定すると、その値が表示されます。
included_number_stdin は 改行コードが含まれていることがわかります。

変数だけでなく、メソッドを実行することもできます。
number.include?(included_number)
number.include?(included_number_stdin)
を再度 実行させてみています。
exit で debugger を抜けることができます。

pry の使い方は 別途 ネットで検索をすればたくさんの情報を得ることができます。

投稿2014/10/04 09:17

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2014/10/04 11:50

デバッグの方法のご教授、ありがとうございます。Rubyのデバッガ関する知識がないので、かなり助かります。次回から活用していきます。丁寧にありがとうございました。
guest

0

getsで得られる文字列には、ENTERした時の改行文字も含まれてしまっているからです。
gets.chompで末尾の改行文字を取り除けば"3"だけが得られます。


※最初、1行目の「ENTERした時の改行」と入力しているのですが、表示がおかしくなっていました。

投稿2014/10/04 08:20

argius

総合スコア9388

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

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

退会済みユーザー

退会済みユーザー

2014/10/04 11:45

ご回答ありがとうございます。なぜ改行文字が含まれるのか理解していませんでしたが、ENTERによるものだったのですね。以降はまらないよう気をつけます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問