Ruby文法: 変数hogeの値が指定した四つの値に一致するかどうかを判定する式の簡素な書き方

このQ&Aのポイント
  • Ruby文法で、変数hogeの値が指定した四つの値 ('h', 'o', 'g', 'e') に一致するかどうかを判定する式を簡素に書く方法を教えてください。
  • 現在の書き方では、hoge=='h' || hoge=='o' || hoge=='g' || hoge=='e' と四回も同じ比較を書く必要がありますが、より簡素な書き方はありますか?
  • 関数を使って、変数hogeの値が ('h', 'o', 'g', 'e') のいずれかに一致するかどうかを判定できるような方法があれば教えてください。
回答を見る
  • ベストアンサー

ruby 文法 どれかに一致

変数hogeの値が次の四つの値 'h','o','g','e' と等しいか? の判定を行う式を書きたいです。(正規表現は使わないとします。) hoge='V' if hoge=='h' || hoge=='o' || hoge=='g' || hoge=='e' puts 'ok' end 上記の様に書いたのですが、四回もhoge==を書いてとってもメンド臭かったです。 もう二度とこんなメンドクサイ事はしたくありません。 もっと楽な書き方がある様な気がするのですが、どうしたらよいでしょう? なるべく簡素な書き方が良いです。 関数を作るなど、最初はちょっとメンドクサイけど、後は一生楽ができる方法でも良いです。 お願いします。

  • Ruby
  • 回答数1
  • ありがとう数14

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

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

いろいろ書き方がありますが if %w[h o g e].include?(hoge) if ["h", "o", "g", "e"].include?(hoge) if "hoge".include?(hoge) あたりでどうでしょうか。最後のはhogeが一文字でないと少し違いますが。

nomorevup
質問者

お礼

あ~ なんて楽な書き方でしょう。 それになんと優雅なことでしょう。 これで一生楽ができます。 ごかいとうありがとうございました。

関連するQ&A

  • 【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】

    #!/usr/bin/ruby -Ke (略) $hoge = input["hoge"] def aaa() (略) end def bbb() (略) end if input["hoge"] aaa() end bbb() このように関数bbbでhtmlのフォームの値hogeを利用して 関数aaaを実行させるプログラムですが、 関数bbbで使用した変数の値をaaaでも利用したいのですが、 よい方法はあるのでしょうか? グローバル変数を$hoge = input["hoge"]の後で $hoge=[]と定義すると、初期化されてしまい、 関数bbbの中でグローバル変数を定義しても駄目でした。

  • Ruby 文法 ブロックの中で自クラスの定数を呼ぶ

    以前した質問(http://okwave.jp/qa/q8484921.html)と非常に似てる質問になります。 以前の質問ではブロックの中で、そのクラスのメソッドを呼ぶ時のことでしたが、今回はメソッドではなく、定数にアクセスする時の質問です。 class Hoge VAL=1 def piyo yield end end h=Hoge.new h.piyo do |this| puts Hoge::VAL #<ーココの話 end 上の様に書く時、ブロックの中で、そのクラスの中の定数を参照するとき、上の例だと Hoge::VAL と書いてますが、Hoge::と書くのがとても嫌なので、以下の様に書いてみました。 class Hoge VAL=1 def piyo yield self end def retVal VAL end end h=Hoge.new h.piyo do |this| puts this.retVal #<-Hoge::VALと書かなくてよくなった。 end が、しかし実はVALなどの定数は多数あり、その数の分だけ値を返すメソッドを書くなんて、もっと嫌です。 なんか良い書き方はあるのでしょうか? 以下、蛇足なのですが、そもそもクラスの中でしかアクセスしないマジックナンバー的な定数の定義の仕方が間違っているのでしょうか? moduleに定義して、クラスの中とブロック使うところでincludeするなどの方がスッキリするのかも。。

    • ベストアンサー
    • Ruby
  • ruby の nil エラー

    rubyで10C0~10C10までの値をすべて合計する 計算をさせようと思って作ったのですが。 定義はうまくできa(10,1)=10と計算できるのですが whileで合計させているところがうまくいきません。 関数的にはあっていると思うのですがnilエラーになってしまい ます。原因はなんなのでしょうか。。。 定義開始 ーーーーーーーーーーーーーーーーーーーーーー def a(g,h) puts a=1 b=1 while a<=g do b = b * a a = a + 1 end c=1 d=1 while c<=h do d = d * c c = c + 1 end e=1 f=1 while e<=g-h do f = f * e e = e + 1 end puts b / ( d * f ) end ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 定義終了 aa=0 ab=0 while aa <= 10 ab=a(10,aa)+ab aa=aa+1 puts ab end これをすると ab=a(10,aa)+ab ここがNoMethodErrorと表示され 解がでません。 また、ab=a(10,aa)+ab これを ab=a(10,aa) こうすると 解がちゃんとでるのですが。 1 nil 10 nil 45 nil 210 nil . . . となってしまいます。

    • ベストアンサー
    • Ruby
  • 【ruby】 『クラスの生成に失敗』を表現したい

    『クラスの生成に失敗』を表現したいのです。 newの戻り値にnilやfalseを返せばよいと考え、 以下の様に書いてみました。(行頭は全角スペースです。) class Hoge  def initialize(arg)   return arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h) errはputsされませんでした。(グーグルで調べるとinitializeのreturnは、返ってこないそうでした。) そこで以下の様に書きました。(行頭は全角スペースです。) class Hoge  attr_reader :stat  def initialize(arg)   @stat = arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h.stat) なんか、ものすごく我流になってる気がします。。。 アドバイスをお願いいたします。

    • ベストアンサー
    • Ruby
  • rubyのunlessで遊んでいたら

    Rubyのunlessで適当にプログラムをつくって遊んでいました。 01:a = 10 #aに10を代入 02:b = 20 #bに20を代入 03: 04:unless a > b 05: puts "aはbより大きくない" 06:else 07: puts "aはbより小さくない" 08:end 09:#unless文にはelsif節等がなく、条件項目を増やせないのでaとbの値が同じ場合は 10:#どうしようかと、これをif文で補おうとしました。 11:if a = b 12: puts "aとbは同じです" 13:end 14: 15:puts "a=#{a} b=#{b}" そもそも、aとbの値が同じでない場合11行目のifが実行されることは無いだろうと思っていたのですが実効結果は ↓ aはbより大きくない aはbと同じ a=20 b=20 という結果がでました。実行結果一行目の「aはbより大きくない」と出力されたのはプログラム4行目のunless文の返した結果だろうと理解できましたが、実行結果2行目のif文の結果である「aはbとおなじ」が出力されたのか、実行結果3行目でaとbの変数内を参照しておりますが、ここでどうしてaの値が20に変更されているのか、わかりません。 詳しい方いらっしゃいましたらご教授願います。

    • ベストアンサー
    • Ruby
  • rubyの構文(&&を用いた条件分岐について)

    ruby初心者です。 最近、ruby on railsで書かれたソースを引き継ぎ解析を行っています。 その中で、以下のような構文が出てきました。 ========================================= num = 0 bool = false vals = '' puts 'start' num == 0 && bool && if vals  puts 'true' else  puts 'false' end puts 'end' ========================================= 上記プログラムを実行すると、if ~ end までが実行されませんでした。 そこで、変数boolをtrueに変更して再実行したところ、if文が実行されました。 そこで私は、上記プログラムは以下と同値であると解釈しました。 ====================================== (省略) if num == 0 && bool  if vals   puts 'true'  else   puts 'false'  end end ======================================= 以上を踏まえて・・・ 1.私の解釈は正しいでしょうか? 2.間違っている場合、正しい処理の解釈を教えていただけますでしょうか?または参考URLを教えていただけますと助かります。 文の最後に"&&"がついている文を見たことがなく、ネットで調べても 正解らしいものが掲載されていなかったので質問させていただきました。 拙い説明で申し訳ありませんが、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 【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
  • 配列への分割方法

    XML初心者です。 Perlでいう以下の処理を行いたいのですが、XMLではどのような記述になりますでしょうか。 $hoge_a = "h o g e"; @hoge = split(/ /,$hoge_a); ↓ $hoge[0] = h $hoge[1] = o $hoge[2] = g $hoge[3] = e 自分なりに調べたのですが、XMLでは配列という概念が見つかりませんでした。 よろしくお願いします。

    • ベストアンサー
    • XML
  • Ruby defにするとエンコードがおかしくなる

    あるif文をdefでまとめて動かしたところ、西欧のエンコードで表示されてしまうのですが、 これはエラーですよね?正しい動作にならないのですが、どうしたらよいでしょうか。 def search_kansi(h) if h == 1 kansi = "甲子" elsif h == 2 kansi = "乙丑" elsif h == 3 kansi = "丙寅" else kansi ="無効な値が入力されました" end return kansi end #def nikkan = search_kansi(h) print nikkan

専門家に質問してみよう