メインコンテンツまでスキップ
バージョン: 開発中

Value type

Value type ( expression ) -> 戻り値

引数説明
expression🡒テストしたい結果を返す式
戻り値倍長整数🡐データ型の数字

説明

Value type コマンドはexpression 引数に渡した式の評価の結果の値の型を返します。

コマンドが返す数値は、Field and Variable Types テーマにある以下の定数と比較することが可能です:

定数
_o_Is float倍長整数35
Is BLOB倍長整数30
Is Boolean倍長整数6
Is collection倍長整数42
Is date倍長整数4
Is longint倍長整数9
Is null倍長整数255
Is object倍長整数38
Is picture倍長整数3
Is pointer倍長整数23
Is real倍長整数1
Is text倍長整数2
Is time倍長整数11
Is undefined倍長整数5
Is variant倍長整数12
Object array倍長整数39

このコマンドはスカラー式の型を返すようにデザインされています。つまり、expression 引数に格納されている、あるいはその式から返される値の型です。具体的には、以下の4D式に対して適用可能です:

  • オブジェクトプロパティ (emp.name)
  • コレクション要素 (myCol[5])

注: 数値型のオブジェクトプロパティは常に実数値としてみなされます:

 var $o : Object
 $o:=New object("value";42)
 $vType:=Value type($o.value) //$vType=Is real

Value type コマンドは有効な4D式(フィールド、変数、引数を含む)であれば適用可能です。この場合、Type コマンドとは異なり、Value typeexpression 引数に渡された式の結果の値の内部的な型を返し、宣言された型を返すわけではありません。4Dランゲージは内部的に値の型を変換することがあるため、Value type の結果は宣言された型とは異なることがあります。例えば、4Dは内部的に"整数64bit"型のフィールド値を変換します。このため、以下の例のような結果が出ることがあります:

 $vType1:=Type([myTable]Long64field) //$vType=Is integer 64 bits(64-bit整数型)
 $vType2:=Value type([myTable]Long64field) //$vType=Is real(インタープリタモードでは実数型)

他には配列(配列の評価はカレントの要素のインデックスを返します)やコンパイルモードなどが結果の差異に関係します。以下の表はこの差異をまとめたものです:

宣言された型Type結果Value type の結果(インタープリタ版)Value type の結果(コンパイル版)補足
ARRAY TEXT($t;1)Text arrayIs realIs longint$t には数値であるカレントの要素インデックスが格納されます
文字 fieldIs alpha fieldIs textIs text4Dは内部的には全ての文字列をテキストとして管理します
整数 fieldIs integerIs realIs longint最適化のため、インタープリタモードは数値は全て実数として管理されます。
倍長整数 fieldIs longintIs realIs longint同様にコンパイルモードでは全ての整数値は倍超整数とみなされます。(*)
整数64bit fieldIs integer 64 bitsIs realIs longint

(*) コンパイルモード、インタープリタモードの両方において有効な数値型の値のテストを書きたい場合には、以下のようなコードの使用を検討してください:

 If(Value type($myValue)=Is longint)|(Value type($myValue)=Is real)

互換性に関する注意: 4D v16 R6 以降、日付はオブジェクトプロパティ内では日付型あるいはISO日付フォーマットのテキストとして保存されています。詳細な情報については、SET DATABASE PARAMETER コマンドのDates inside objects セレクターを参照してください。

例題 1

オブジェクトプロパティの値が取り得る様々な型に対応したい場合を考えます:

 Case of
    :(Value type($o.value)=Is real)
  //数値を管理
    :(Value type($o.value)=Is text)
  //テキストを管理
    :(Value type($o.value)=Is object)
  //オブジェクト内オブジェクトを管理
       ...
 End case

例題 2

コレクション内の全ての数値の合計を計算したい場合を考えます:

 var $col : Collection
 var $sum : Real
 $col:=New collection("Hello";20;"World2";15;50;Current date;True;10)
 For($i;0;$col.length-1) //コレクションが0から始まるのでlengthを-1をする
    If(Value type($col[$i])=Is real)
       $sum:=$sum+$col[$i]
    End if
 End for
 ALERT(String($sum)) //95

参照

OB Get type
Type