• ベストアンサー

【Ruby】基本的な質問 数字をローテーション

012 012 012 ..... 0、1、2と数値をローテーションさせたいです。 そこで以下の様に書いてみました。 r=0 loop do puts r r=r<3 ? r+1 : 0 sleep 1 end 012 3 012 3 012 3 ..... になってしまいます。 以下の様に書けば良いのですが、 r=0 loop do puts r r+=1 r=r<3 ? r : 0 sleep 1 end どうして、最初の式はダメなのでしょう? なんか理解できません。 以上、よろしくご指導の程お願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4856/10272)
回答No.1

r=r<3 ? r+1 : 0 rが2だったら、r<3が真なので、r+1 つまり3になります。 r=r<2 ? r+1 : 0 では?

kingfruits
質問者

補足

notnotさん、ご回答有り難うございます。 なんか、混乱してました。もう大丈夫です。スッキリしました。 ときどき、変な所で、頭の中がループしちゃうのです。そんなときは、ココがとても助かります。 notnotさんには、いつもお世話になってる気がします。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【ruby】無名関数?でブロック付きメソッドって作れませんか?

    Proc.new do|arg|  arg.each do |x|   puts x  end end.call([1,2,3,4,5]) 上記のようなものを無名関数と理解しているのですが、 これを下記の様にすると、 Proc.new {|arg|  arg.each do |x|   yield(x)  end }.call([1,2,3,4,5]) do |x|  puts x end no block given とエラーになってしまいます。 無名関数で、ブロック付きメソッドって作れないものでしょうか? ご指導の程、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • 【ruby】【文法?】ブロックをbreakした時。。

    質問を見ていただいて有難うございます。 質問を一言で言うと、 「メソッドの中で呼び出し元がbreakを使った事を検知できるか?」 となるのでしょうか。。。以下に詳しく質問を記述いたします。 引数に配列を渡すと、その配列をブロックに一つずつ返してくれる メソッドhoge()があるとします。 以下の様に使います。 ------------------------------------- hoge([0,1,2]) do |x|  puts x end 実行結果 0 1 2 ------------------------------------- このhoge()は、実行中にエラーが発生した場合、トラップして falseを返す事とします。(何事もなければtrueを返します。) このhoge()を以下の様に書きました。 def hoge(arg)  begin   arg.each do |x|    yield x   end  rescue   false  else   true  end end 以下の様に使います。 ------------------------------------- ret=hoge([0,1,2]) do |x|  puts x end puts ret ? 'success' : 'fail' 実行結果 0 1 2 success ------------------------------------- ------------------------------------- ret=hoge(nil) do |x|  puts x end puts ret ? 'success' : 'fail' 実行結果 fail ------------------------------------- ここまでは、よかったのですが、hoge()のブロックの中で、breakを使うと hoge()の戻り値はnilになってしまいます。 ------------------------------------- ret=hoge([0,1,2]) do |x|  break if x==1  puts x end puts ret puts ret ? 'success' : 'fail' 実行結果 0 nil fail ------------------------------------- ここで質問です。 最後の例は、hoge()として異常系ではないので、retにtrueを与えたいのですが、どうしたらよいでしょうか? ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • ruby forkについて教えて下さい

    親プロで用意した配列の中の要素を一つづつ子プロでputsした後、最後一回、親プロで生成した子プロのPIDを確認したいです。 こんなふうに書いてみました。 #!/usr/bin/ruby table=%w(a b c d) array=[] while i=table.pop do if pid=fork then array.push pid puts pid break if table.size > 0 p array else puts i end end 実行すると、以下のような結果になりました。 $9200 c 9201 b 9202 [9202] a $ PIDが一つしか得られてません。 どうしたらよいでしょうか? ご教授の程、宜しくお願いいたします。 rubyは 1.8.7 を使ってます。 以上、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • 【Ruby】マルチスレッドでなくマルチプロセスで

    以下の様なプログラムをマルチスレッドでなくマルチプロセスで実現したいです。 #!/usr/bin/ruby require 'thread' q=Queue.new data=%w(a * * * b * * c * * d * *) data.each do |d| q.push d end (1..4).each do |n| Thread.start { while 1 do d=q.shift break if d!='*' end puts n.to_s+' '+d.to_s }.join end rubyのバーションは ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin10.0] です。バージョンをあげる事は、できれば避けたいです。 実際には上記プログラムの【puts n.to_s+' '+d.to_s】してる所は、ネットに繋いで云々の時間のかかる処理なのですが、まったくパラレルに行なっている様子が無いので、マルチプロセス化したら早くなるかなと思いました。 子プロセスを生成して親プロセスとはパイプで繋いで、、などとするのかなあと試行錯誤したのですが、どうもうまくできません。 ご指導の程、よろしくお願い申し上げます。

    • ベストアンサー
    • Ruby
  • マクロの基本的なことについて質問です。

    マクロの基本的なことについて質問です。 1、Sub 前判定until() i = 1 Do Until i > 10 i = i + 1 Loop MsgBox ("カウンタは" & i & "になりました") End Sub メッセージは11になります。 2、Sub 前判定while() i = 1 Do While i > 10 i = i + 1 Loop MsgBox ("カウンタは" & i & "になりました") End Sub メッセージは1になります。 1、はiが10より大きくなるまでというのが条件で、それまでi=i+1を続けるということではないんでしょうか。つまり、最初はi=1なので、メッセージは「2」になるのではと思うのですが… 2、も同様にわかりません。難しくて頭が混乱しています。どなたか分かりやすい例などを沿えて回答を頂けると有り難いです。どうかよろしくお願いします。

  • Do whileでExitせず、ループの最初に戻る方法

    よろしくお願いします。 環境 Excel 2003 Do whileのループ内で、Exitのような記述方法で、ループの最初に戻る方法はありますでしょうか? イメージは以下のような形です。 Sub hoge() r = 0 rr = 5 Do While r < 6 'ここに戻る If r = 3 Then 'ここでDo while の最初に戻る End If Loop End Sub よろしくお願いいたします。

  • 【ruby】二つのブロック付きメソッドをif文で使い分けたい

    二つのブロック付きメソッドhogeとpiyoがあるとします。 ブロックの中に記述するプログラムは同じだが、hogeを使うか、piyoを使うかは条件により制御したいです。 このような場合、どのように書いたら簡素になるでしょうか? sw=true if sw then  hoge() do |x|   puts x  done else  piyo() do |x|   puts x  done end 上記例では冗長の思うのですが、ご指導のほど宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • 【ruby】subの使い方

    文字列から最初の/~/までを切り取りたいです。 たとえば、"/aaa/bbb/ccc"の場合、"/aaa/"です。 そこで、subを使って以下の様に書いてみました。 puts "/aaa/bbb/ccc".sub(/(\/.*?\/)/,'\1') しかし、/aaa/bbb/cccと表示され、期待した結果が得られません。 以下の様にすると、 /(\/.*?\/)/=~"/aaa/bbb/ccc" puts $1 期待通り/aaa/が表示されるのですが、正規表現はsubのときと同じだし、 subの使い方の何が悪いのかわからなくなってしまいました。 ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • [Ruby] irbにおける文字化け

    Rubyを勉強を始めようと思いまして、Active Script Ruby1.8.22をインストールし、irb(Interactive RuBy)を使って簡単な機能の勉強をしていました。 その際、ある特定の場合、日本語が文字化けしてしまう。という分からないことが出てきましたので質問させて頂きます。 一つ目は、 printやputsなどで日本語を表示させようとする場合、 print("") print("あいうえお") のように、print("") と入力後、カーソルを移動させ "" の中に あいうえお を入れた後エンターすると以下のように print("あいうえお")と表示されるところが文字化けしてしまうということです。しかし、それを実行すると、しっかりと あいうえお と表示されます。 irb(main):031:0> print(" 「 、 ヲ ィ") あいうえお=> nil これを文字順通りに、 print(" print("あいうえお print("あいうえお") のように、print("  の後に、あいうえお を入力。その後括弧閉じすると以下のようにしっかりと、print("あいうえお")と表示されます。 irb(main):032:0> print("あいうえお") あいうえお=> nil どちらの実行結果も変わらず、しっかりと あいうえお と表示されるのですが、やはり命令入力の段階での文字化けが気になります。 二つ目は、 配列の文字化けです。 waza = ["殴る", "蹴る", "強く殴る", "強く蹴る"]といれてエンターすると、以下のように配列の中の日本語が文字化けします。 (また、これも当然一つ目のprintやputsのように、 waza = ["殴る", "蹴る", "強く殴る", "強く蹴る"] を書く際に先に waza = ["", "", "", ""] と書いた後、カーソル移動で日本語入力すると、命令の部分も文字化けします。以下に載せているのは、命令部分が文字化けしないように左から順に書いていったものです。) irb(main):022:0* waza = ["殴る", "蹴る", "強く殴る", "強く蹴る"] => ["\211\243\202\351", "\217R\202\351", "\213\255\202\255\211\243\202\351", "\ 13\255\202\255\217R\202\351"] irb(main):023:0> 5.times do irb(main):024:1* waza.each do |w| irb(main):025:2* print(w) irb(main):026:2> print(" ") irb(main):027:2> end irb(main):028:1> print("\n") irb(main):029:1> end 殴る 蹴る 強く殴る 強く蹴る 殴る 蹴る 強く殴る 強く蹴る 殴る 蹴る 強く殴る 強く蹴る 殴る 蹴る 強く殴る 強く蹴る 殴る 蹴る 強く殴る 強く蹴る => 5 これも、printやputsと同じように結果はしっかりと文字化けせず表示されるのです。 使用OSはWindows XP Home Edition version2002 Service Pack 2です。 あまりよく分かっていないため、分かりにくく、ややこしい文ですが、回答をお待ちしています。よろしくお願いします。 状況等で詳しく知りたいところや何か分からない所がありましたら質問していただければ幸いです。分かる範囲で答えたいと思います。 参考になるかは分かりませんが、他の文字での文字化け例を下記します。 [1]左から順に入力したputs("こんにちは") irb(main):035:0> puts("こんにちは") こんにちは => nil [2]先にputs("")を入力したputs("こんにちは") irb(main):036:0> puts(" ア ノ ソ ヘ") こんにちは => nil [3]waza =["", "", "", ""]を先に入力後カーソル移動で日本語入力したwaza = ["殴る", "蹴る", "強く殴る", "強く蹴る"] irb(main):037:0> waza =[" 」 ・, " R ・, " ュ ュ 」 ・, " ュ ュ R ・] => ["\211\243\202\351", "\217R\202\351", "\213\255\202\255\211\243\202\351", "\2 13\255\202\255\217R\202\351"] irb(main):038:0> waza[0] => "\211\243\202\351" irb(main):039:0> waza[1] => "\217R\202\351" [4]wazaの要素の出力 irb(main):040:0> waza.each do |w| irb(main):041:1* print(w) irb(main):042:1> end 殴る蹴る強く殴る強く蹴る=> ["\211\243\202\351", "\217R\202\351", "\213\255\202\2 55\211\243\202\351", "\213\255\202\255\217R\202\351"]

  • Rubyの引数が理解できません。(初心者です)

    プログラミング言語を覚えたいと考え、諸々の事情からRubyを独学したいとおもっております。 先日、「14歳からはじめるRuby…」という本を購入し、早速勉強を始めたのですが、引数でいきなり躓いてしまいました。 以下のような例文がありましたが、原理(理屈?)が理解できません。ご教唆お願いします。 001 def syomei s 002  puts "" 003  puts "============" 004  puts "" + s 005  puts "============" 006 end 007 puts "What's your name?" 008 name = gets.chomp 009 puts "Hello," + name + "!" 010 syomei name なぜ、これでメソッドの中へ変数が引き渡されるのかが理解できません。 「008 name」で初めて出てくるnameと引数"s"が何故イコールになるのでしょうか? 例えば(全くのデタラメですが)、「010 syomei name.s」であったり「010 syomei name = s」などのように定義付けされているのであれば、納得できるのですが…。 初歩中の初歩なのはわかっているのですが、理屈を理解したいと思ってます。よろしくお願いします。

トナー交換のエラー
このQ&Aのポイント
  • MFC-L3770CDWを使用しています。トナーを交換してもエラーメッセージが消えません。
  • ブラザー製品MFC-L3770CDWのトナー交換時にエラーメッセージが表示され、解消できない状況です。
  • MFC-L3770CDWでのトナー交換後、エラーメッセージが表示されている問題が発生しています。
回答を見る