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

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

ただいまの
回答率

90.62%

  • Ruby

    7302questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 798
退会済みユーザー

退会済みユーザー

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

number = "304"

included_number = "3"

p number.include?(included_number) 

included_number_stdin = gets.to_s # 標準入力から3を渡す

p number.include?(included_number_stdin) 

出力結果

######################################

$ ruby stdin_test.rb 
true
3
false

######################################


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

代入の後でp included_number_stdinとすればわかると思いますが、included_number_stdin には、3と改行が入っています。
included_number_stdin = gets.chomp
または
included_number_stdin = gets.strip
としてください。

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2014/10/04 20:42

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

    キャンセル

0

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


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2014/10/04 20:45

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

    キャンセル

-1

ステップ実行して値を調べれば、自力で解析できるようになります。
ここでは pry という 機能をつかっての debug 方法を紹介します。
1. $ gem install pry
  を実行して、 pry を install します。 
2. ソースコードを次のように書き換えます。(pry をロードする、ブレークさせたい箇所に binding.pry と書く)
require 'pry'

number = "304"
included_number = "3"

p number.include?(included_number)

included_number_stdin = gets.to_s # 標準入力から3を渡す                                                                 
binding.pry
p 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 20:50

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

    キャンセル

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

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

関連した質問

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

  • Ruby

    7302questions

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