Skip to main content

IF (ObjectScript)

ブーリアン式を評価し、式の真理値を基にして、実行するコード・ブロックを選択します。

構文

IF expression1,... { code } 
ELSEIF expression2,... { code } 
ELSE { code } 

あるいは

I expression1,... { code } 
ELSEIF expression2,... { code } 
ELSE { code } 

引数

引数 説明
expression1 IF 節のブーリアン・テスト条件。単一の条件、またはコンマで区切られた条件のリスト。
expression2 ELSEIF 節のブーリアン・テスト条件。単一の条件、またはコンマで区切られた条件のリスト。
code 中括弧で囲まれた ObjectScript コマンドのブロックです。

概要

ここでは、IFELSEIF、および ELSE コマンド・キーワードについて説明します。これらはすべて、IF コマンドの構成要素節と見なされます。IF キーワードは、I と省略できます。他の 2 つのキーワードは省略できません。

1 つの IF コマンドには 1 つの IF 節が含まれ、その後に任意の数の ELSEIF 節、最後に 1 つの ELSE 節と続きます。ELSEIF 節と ELSE 節はオプションですが、ELSE 節は常に指定する方がわかりやすいプログラムになります。

IF コマンドは最初に IF 節の expression1 を評価し、expression1 が True の場合、それに続く中括弧内のコード・ブロックを実行し、IF コマンドを終了します。

expression1 が False の場合、IF 文の次の節に実行を移します。(存在する場合は) 最初の ELSEIF 節を評価します。ELSEIF 節内の expression2 が True の場合、それに続く中括弧内の ELSEIF コード・ブロックを実行し、IF コマンドを終了します。expression2 が False の場合、次の ELSEIF 節 (ある場合) が同様に評価されます。後続の各 ELSEIF 節は、それらの 1 つが True と評価されるまで、あるいはすべてが False と評価されるまでリストの順序でテストされます。

IF 節とすべての ELSEIF 節が False と評価された場合、実行は ELSE 節に移動します。それに続く中括弧内の ELSE コード・ブロックを実行し、IF コマンドを終了します。ELSE 節が省略されている場合、IF コマンドを終了します。

IF はブロック型のコマンドです。各コマンド・キーワードの後には、中括弧 ( { } ) で囲まれたコード・ブロックが続きます。IF 節、ELSEIF 節、および ELSE 節は余白 (改行、インデント、空白スペース) を自由に使用できます。ただし、各 IF キーワードと ELSEIF キーワードはそれぞれ、ブーリアン・テスト式の最初の文字と同じ行に置き、1 つの空白スペースで区切る必要があります。ブーリアン・テスト式は複数行に記述でき、また複数の空白スペースを含むことができます。

開き中括弧や閉じ中括弧は、1 行で独立して記述するか、コマンドと同じ行に記述できます。開き中括弧や閉じ中括弧は、列 1 に記述してもかまいませんが、お勧めはできません。推奨されるプログラミング手法として、入れ子になったコード・ブロックの開始と終了を示すために、中括弧はインデントするようにしてください。開き中括弧の前後に空白を入れる必要はありません。閉じ中括弧の前後に空白を入れる必要はありません。引数のないコマンドに続く中括弧の場合も同様です。中括弧の空白に関する唯一の要件は、IF コマンドの最後の節の最後の閉じ中括弧とその後のコマンドを、スペース、タブ、または改行で区切る必要があるということです。

IF コマンドは別の IF コマンド内に入れ子にすることができます。複数レベルの入れ子がサポートされます。

IF コマンドは、$TEST 特殊変数の値の読み取りや設定を行いません。ブーリアン・テスト式が True と評価されると、$TEST の値にかかわらず、中括弧内のコード・ブロックを実行します。

引数

expression1

IF 節のテスト条件。単一の式かコンマで区切られた式のリストの形式をとります。式リストでは、InterSystems IRIS は左から右の順で、個別の式を評価します。コンマ区切りリスト内で False に評価される式に遭遇すると評価を終了します。コンマ区切りリスト内のすべての式が True と評価されると、InterSystems IRIS は IF 節に関連するコード・ブロックを実行します。リスト内の式が 1 つでも False と評価されると、InterSystems IRIS は残りの式を無視し、IF 節に関連するコード・ブロックを実行しません。

通常、expression1 は True または False と評価されるブーリアン式です (x=7 など)。"演算子と式" を参照してください。IF は、以下のようにリテラル値をブーリアンの True および False として解釈します。

  • TRUE : ゼロ以外の数値、またはゼロ以外の数値に評価される数値文字列。例 : 1、7、-.007、"7-7"、"7dwarves"。

  • FALSE : ゼロの数値、またはゼロの数値に評価される文字列。ゼロの数値に評価される非数値文字列。0、-0.00、7-7、"0"、"TRUE"、"FALSE"、"strike3"、空文字列 ("") など。

For further details, refer to Strings as Numbers.

expression2

ELSEIF 節のテスト条件。単一の式かコンマで区切られた式のリストの形式をとります。これは expression1 と同じ方法で評価されます。

QUIT での IF

QUIT コマンドが IF コード・ブロック (あるいは ELSEIF コード・ブロックまたは ELSE コード・ブロック) 内にある場合、QUIT は、このコード・ブロックが存在しないかのように、通常の QUIT コマンドとして動作します。この動作は、その他の種類の中括弧のコード・ブロック (FOR、WHILE、DO...WHILE、TRY、CATCH) 内にある QUIT と異なります。

  • IF コード・ブロックが、ループ構造 (FOR コード・ブロックなど) 内で入れ子にされている場合、QUIT はそのループ構造ブロックを終了し、このループ構造コード・ブロックに続くコマンドで実行を続けます。

  • IF コード・ブロックが TRY ブロックまたは CATCH ブロック内にある場合、QUITTRY ブロックまたは CATCH ブロックを終了し、TRY ブロックまたは CATCH ブロックに続くコマンドで実行を続けます。

  • IF コード・ブロックがループ構造内または TRY ブロックまたは CATCH ブロックで入れ子にされていない場合は、QUIT は現在のルーチンを終了します。

RETURN を発行すると、ブロック構造内で発行されたどうかに関係なく、現在のルーチンが終了します。

以下の例では、IF がループ構造内にない場合の QUIT の動作を示しています。QUIT はルーチンを終了します。

  SET y=$RANDOM(10)
  IF y#2=0 {
    WRITE y," is even",!
    QUIT
    WRITE "never written"
    }
  ELSE {
    WRITE y," is odd",!
    QUIT
    WRITE "never written"
    }
  WRITE "QUIT out of the IF (never written)"

以下の例では、IF がループ構造内にある場合の QUIT の動作を示しています。QUIT は、FOR ループを終了してルーチンの実行を続けます。

  FOR x=1:1:8 {
    IF x#2=0 {
      WRITE x," is even",!
      QUIT:x=4
    }
    ELSE {
      WRITE x," is odd",!
    }
  }
  WRITE "QUIT out of the FOR loop (written)"

以下の例では、IFTRY ブロック内にある場合の QUIT の動作を示しています。QUITTRY ブロックを終了した後、CATCH ブロックに続く次のコードでルーチンの実行が継続されます。

  TRY {
  SET y=$RANDOM(10)
    IF y#2=0 {
      WRITE y," is even",!
      QUIT
      WRITE "never written"
    }
    ELSE {
      WRITE y," is odd",!
      QUIT
      WRITE "never written"
    }
  WRITE "QUIT out of the IF (never written)" 
  }
  CATCH exp1 {
    WRITE "only written if an error occurred",!
    WRITE "Error Name: ",$ZCVT(exp1.Name,"O","HTML"),!
  }
  TRY {
    WRITE "on to the next TRY block"
  }
  CATCH exp2 {
    WRITE "only written if an error occurred",!
    WRITE "Error Name: ",$ZCVT(exp2.Name,"O","HTML"),!
  }

GOTO での IF

IF コード・ブロック内に GOTO がある場合、プログラムは特定の制限に従い実行されます。

GOTO 文は IF コマンドの外側、あるいは現在の節のコード・ブロック内に移動できます。GOTO 文は他のコード・ブロックには移動できません。つまり、現在の IF コマンドの別の節に属するコード・ブロックや、他の IFFORDO WHILE、または WHILE コマンドに属するコード・ブロックには移動できません。

以下の例では、IF コマンドを使用して、回答者を 3 つのグループのいずれかに分類し、適切なサブルーチンを呼び出します。3 つのグループは、44 歳以下の女性のグループ、44 歳以下の男性のグループ、45 歳から 120 歳までの男女のグループです。この例では、性別評価式は包含関係演算子 ( [ )を使用します。("演算子と式" を参照してください。)

Mainloop
  NEW sex,age
  READ !,"What is your sex? (M or F): ",!,sex QUIT:sex=""
  READ !,"What is your age? ",!,age QUIT:age=""
  IF "Ff"[sex,age<45 {
    DO SubA(age)
  }
  ELSEIF "Mm"[sex,age<45 {
    DO SubB(age)
  }
  ELSEIF "FfMm"[sex,age>44,age<125 {
    DO SubC(age)
  }
  ELSE {
    WRITE !,"Invalid data value input"
  }
SubA(y)
  WRITE !,"Young woman ",y," years old"
SubB(y)
  WRITE !,"Young man ",y," years old"
SubC(y)
  WRITE !,"Older person ",y," years old"

関連項目

FeedbackOpens in a new tab