人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

rubyのeach内でifを使うとおかしなことになります。

xxxxxx_arr.reverse.each {|xxx|
if xxx != confilm then
puts xxx
puts confilm
connection.query("insert into xxx (x,xx,xxx) values(#{quote_ident(xxxxx)},2,3)")
else
puts '終了'
break
end
}

これを実行すると必ず終了が一度は出力されるようにしたのですが
なぜか出力されません。
3行目、4行目のputsで確認したのですがやはり同じ文字列が並ぶことが必ずあるので
終了が一度は出力されるはずなんです。
ですが出力されません。

これはなぜでしょうか?

答えだけでなく
どこを学び直す必要があるのかまで答えてもらえるとうれしいです。

よろしくお願いします。

●質問者: 匿名質問者
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● 匿名回答1号
ベストアンサー

putsで文字列が表示されたからといって xxx == confilm が成立するとは限りません。
たとえば puts "Class" と puts Class は同じ文字列 Class を出力しますが、"Class" == Class はもちろん成立しません。

irb(main):010:0> a = "Class" ; puts a
Class
=> nil
irb(main):011:0> b = Class ; puts b
Class
=> nil
irb(main):012:0> a == b
=> false

つまり puts の出力結果だけで同じものかどうか判別できるとは限りません(できる時もあるし、できない時もある)。
動作確認をするならば puts の代わりにたとえば p を使ってみてください。すくなくとも文字列とそれ以外はわかりやすく区別が付くと思います。

irb(main):005:0> p Class
Class
=> Class
irb(main):006:0> p "Class"
"Class"
=> "Class"

質問のソースコードからはそもそもconfilmがなんであるかがわからないのですが、何かの値やインスタンスが入っているのでしょうか?
もしくはconnection.queryなどとあるのでデータベース系のライブラリにconfilmというメソッドがあるのでしょうか?
できれば使っているライブラリなども書いてくれると、わからないなりに調べることができるので助かります。

とりあえずはRubyでの動作確認の仕方を覚えると良いと思います。


匿名質問者さんのコメント
すいません、まだ聞きたい事があったのですがベストアンサーにしてしまいました。 結果はビンゴでした。 xxxが文字列でconfilmは["文字列"]でした。 分かりやすい回答をしてもらったんですけど まだわからないこともあって、なぜ出力される文字列は同じなのに比較すると等しいことにならないのか?です。 これを理解していないということは何を学べば良いのでしょうか? あと文字列と["文字列"]を等しいとする比較の方法、もしくは["文字列"]を文字列に変換する方法はありますか?

匿名回答1号さんのコメント
putsで出力される文字列が同じなのは偶然です。 putsに配列を渡すと、配列の要素を順番にputsします。 >|ruby| irb(main):004:0> puts([1, 2, 3]) 1 2 3 => nil ||< 配列の要素が一つだけであれば、一つ目の要素をputsするだけです。 そのためputs(["foo"])の出力はputs("foo")と同じ結果になります。 >|ruby| irb(main):009:0> puts("foo") foo => nil irb(main):010:0> puts(["foo"]) foo => nil ||< この件に関しては、Rubyのリファレンスマニュアルのputsの説明を読み、引数が文字列の場合と配列の場合それぞれでなにが起こるのか確認して下さい。これに限らず、メソッドの挙動に疑問を感じたらリファレンスマニュアルを見るのはひとつの手です。お使いのRubyのバージョンに合わせて以下のURLからリファレンスマニュアルを参照してください。 http://docs.ruby-lang.org/ja/2.0.0/doc/index.html ... Ruby 2.0.0のリファレンスマニュアル http://docs.ruby-lang.org/ja/1.9.3/doc/index.html ... Ruby 1.9.3のリファレンスマニュアル 今回confilmが配列だということがわかりましたが、もし配列の中に要素が一つだけで、その中身が必ず文字列であるならば xxx == confilm[0] とすれば同じ文字列として比較できます。confilm[0] は配列の一つ目(先頭)の要素を指します。詳しくはRubyの配列(Arrayクラス)について調べてください。 逆に一つ質問ですが、これまでRubyに関してどのように学習したり調べたりしましたか?
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ