匿名質問者
匿名質問者匿名質問者とは「匿名質問」を利用して質問した質問者。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら

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人5回まで
  • 13歳以上
  • 登録:2013/12/01 22:36:45
  • 終了:2013/12/02 06:40:50

ベストアンサー

匿名回答1号 No.1

匿名回答1号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2013/12/02 00:06:22

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は["文字列"]でした。
分かりやすい回答をしてもらったんですけど
まだわからないこともあって、なぜ出力される文字列は同じなのに比較すると等しいことにならないのか?です。
これを理解していないということは何を学べば良いのでしょうか?
あと文字列と["文字列"]を等しいとする比較の方法、もしくは["文字列"]を文字列に変換する方法はありますか?

2013/12/02 06:47:21
匿名回答1号

putsで出力される文字列が同じなのは偶然です。
putsに配列を渡すと、配列の要素を順番にputsします。

irb(main):004:0> puts([1, 2, 3])
1
2
3
=> nil

配列の要素が一つだけであれば、一つ目の要素をputsするだけです。
そのためputs(["foo"])の出力はputs("foo")と同じ結果になります。

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に関してどのように学習したり調べたりしましたか?

2013/12/02 22:26:08

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません