0

delivery_status3 つの文字列のいずれかであるかどうかをテストする、より読みやすい方法はありますか?

if ["partial", "successful", "unsuccessful"].include? delivery_status

これが私が本当に欲しいものですが、うまくいきません:

if delivery_status == ("partial" or "successful" or "unsuccessful")
4

4 に答える 4

3

私はこれをお勧めしませが、とにかくそれを行うことができます:

def String
  def is_one_of?(array)
    array.include?(self)
  end
end

その後:

if delivery_status.is_one_of?([...])

しかし、はるかに優れた解決策があります: ユースケース (あなたの状況で可能であれば):

case delivery_status
when 'partial', 'successful', 'unsuccessful'
  #stuff happens here
when ... #other conditions
end
于 2013-06-10T15:59:23.250 に答える
1

直感的ではありませんが、正規表現エンジンを使用すると、これらのテストを高速化できます。

STATES = ["partial", "successful", "unsuccessful"]
regex = /\b(?:#{ Regexp.union(STATES).source })\b/i
=> /\b(?:partial|successful|unsuccessful)\b/i

delivery_status = 'this is partial'
!!delivery_status[regex]
=> true

delivery_status = 'that was successful'
!!delivery_status[regex]
=> true

delivery_status = 'Yoda says, "unsuccessful that was not."'
!!delivery_status[regex]
=> true

delivery_status = 'foo bar'
!!delivery_status[regex]
=> false

単語の文字列を検索していない場合は、ルックアップにハッシュを使用します。

STATES = %w[partial successful unsuccessful].each_with_object({}) { |s, h| h[s] = true }
=> {"partial"=>true, "successful"=>true, "unsuccessful"=>true}
STATES['partial']
=> true
STATES['foo']
=> nil

または使用:

!!STATES['foo']
=> false

true/nil/false 以外の値が必要な場合:

STATES = %w[partial successful unsuccessful].each_with_index.with_object({}) { |(s, i), h| h[s] = i }
=> {"partial"=>0, "successful"=>1, "unsuccessful"=>2}

それはあなた01、、、2またはを与えるでしょうnil

于 2013-06-10T17:08:23.427 に答える
1
if %w[partial successful unsuccessful].include? delivery_status
于 2013-06-10T16:01:07.953 に答える
0

@Linuxiosの提案に似たようなことをすることになりました

class String
  def is_one_of(*these)
    these.include? self
  end

  def is_not_one_of(*these)
    these.include? self ? false : true
  end
end

これにより、次のように書くことができます。

if delivery_status.is_one_of "partial", "successful", "unsuccessful"
于 2013-06-10T16:15:26.557 に答える