Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyのcaseステートメント-高度なテクニック

caseステートメントほど単純で退屈なものはありません。これはCからの引き継ぎです。これを使用して、多数のifを置き換えます。名探偵コナンそれともそうですか?

実際、Rubyのcaseステートメントは、想像よりもはるかに豊富で複雑です。一例を見てみましょう:

case "Hi there"
when String
  puts "case statements match class"
end

# outputs: "case statements match class"

この例は、caseステートメントがアイテムのと一致するだけではないことを示しています。 だけでなく、そのクラス 。これが可能なのは、内部でRubyが===を使用しているためです。 オペレーター、別名。 3つの等号演算子。

===のクイックツアー オペレーター

x === yと書くとき Rubyのyは、「yはxで表されるグループに属しているのですか?」と質問しています。これは非常に一般的なステートメントです。詳細は、作業しているグループの種類によって異なります。

# Here, the Class.===(item) method is called, which returns true if item is an instance of the class 

String === "hello" # true
String === 1 # false


文字列、正規表現、範囲はすべて、独自の===(item)を定義します あなたが期待するように多かれ少なかれ振る舞うメソッド。トリプルイコールメソッドを独自のクラスに追加することもできます。

これがわかったので、caseを使用してあらゆる種類のトリックを実行できます。

ケースステートメントの範囲の一致

range === nという事実のおかげで、caseステートメントで範囲を使用できます。 range.include?(n)の値を返すだけです。 。どうすればそんなに確信できますか?ドキュメントにあります。

case 5
when (1..10)
  puts "case statements match inclusion in a range"
end

# outputs "case statements match inclusion in a range"
正規表現とcaseステートメントの照合

/regexp/ === "string"であるため、caseステートメントで正規表現を使用することもできます。 文字列が正規表現と一致する場合にのみtrueを返します。 Regexpのドキュメント これを説明してください。

case "FOOBAR"
when /BAR$/
  puts "they can match regular expressions!"
end

# outputs "they can match regular expressions!"

procsとlambdasのマッチング

これはちょっと変なものです。 Proc#===(item)を使用する場合 、Proc#call(item)を実行するのと同じです 。こちらがそのドキュメントです。これが意味するのは、caseステートメントでラムダとprocを動的マッチャーとして使用できるということです。

case 40
when -> (n) { n.to_s == "40" }
  puts "lambdas!"
end

# outputs "lambdas"

独自のマッチャークラスの作成

上で述べたように、カスタムケースの動作をクラスに追加するのは、独自の===を定義するのと同じくらい簡単です。 方法。これの1つの用途は、複雑な条件付きロジックを複数の小さなクラスに引き出すことです。以下の例で、それがどのように機能するかをスケッチしました:

class Success
  def self.===(item)
    item.status >= 200 && item.status < 300
  end
end

class Empty
  def self.===(item)
    item.response_size == 0
  end
end

case http_response
when Empty
  puts "response was empty"
when Success
  puts "response was a success"
end

  1. JavaScriptのswitchステートメントにreturnステートメントを含めることはできますか?

    JavaScriptのswitchステートメントは、関数内に存在する場合、returnステートメントを含めることができます。この関数はswitchステートメントの値を返し、switchステートメントの後のコードは実行されません。 以下は、JavaScriptのswitchステートメントにreturnステートメントを含めるためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name=&qu

  2. C++での意思決定

    意思決定構造では、プログラマーは、プログラムによって評価またはテストされる1つ以上の条件と、条件が真であると判断された場合に実行される1つまたは複数のステートメント、およびオプションで、条件が真である場合に実行される他のステートメントを指定する必要があります。偽であると判断されます。 以下は、ほとんどのプログラミング言語に見られる典型的な意思決定構造の一般的な形式です- If-Elseステートメント ifステートメントの後にオプションのelseステートメントを続けることができます。これは、ブール式がfalseの場合に実行されます。 C++でのif...elseステートメントの構文は-