プロパティと変数は言葉はわけていますが実態はまったく同じもので機能的な差異はありません。プロパティがStudioにて初期値が入れられ、acsファイルに記録されアクションの処理開始時から値を持っていることぐらいが違いといえます。
例えばHTTPRequestのコンポーネントのプロパティとしてまったく使われることないプロパティ名variableに代入することも可能ですし、またそれを参照してもコンポーネント変数と同様に可能です。
PreMappings:
cp.variable = cv.var1 + cv.var2
cv.var3 = cp.variable
プロパティと変数は、処理方法がおおまかに3つの部分にわかれており、都合上若干違いがある場合がありますが、そこまで違和感ないようにできているはずです。
1. acsはJSONであるためacsからアクションを読み込む時にJSONとしての仕様で値が読み込まれる
2. PreMappings/PostMappingsなどの式はgvalライブラリによって扱われるが、gvalの仕様にしたがってプロパティ、変数が扱われる
3. コンポーネント内部などからプロパティや変数を参照する場合(別の言い方をするとgval以外)、アクションエンジンの仕様にしたがって扱われる
以下書くことは基本的にアクションエンジン内の仕様についてです。gvalやJSONの仕様で違いがある場合は付加して書くことにします。
型はBoolean、整数、浮動小数、日時、文字列、バイト列、配列、Objectがあります。
(内部的に、さらにBCD演算用にDecimal型というのがあるのですが、全体としてや式の中などでどう見せていいのかわからなかったのでひとまず作りはしましたが隠しておきます)
JSONは数値として整数と浮動小数の区別はなく、全て浮動小数として扱われているはずです。結果的にacsから読み込まれる時はBoolean、浮動小数、文字列だけが扱えているはずです。
(実際はまだありますが、ここまでだと理解したほうがわかりやすいと思う)
gvalは数値として整数も浮動小数も扱えますが、計算がある時は全て浮動小数として計算しているはずです。
日時型も扱えているようですが詳細がわかっておらず、ここではうまく書けません。
バイト列もただの配列としてのみ扱えているようです。
配列、Objectはまったく問題なく扱えていて、むしろこの中では一番うまく処理できているので非常に使いやすいと思います。
リテラルとして、配列なら角括弧、Objectなら中括弧で表記できます。
[1, 2, 3]
[“abc”, “def”, “hij”]
[“abc”, 123, cv.variable]
{key1, “key2”:“abc”, key3, key4, 2, 3], “key5”:{“subkey1”:“def”}}
型変換
アクションエンジン内ではそれぞれの型からそれぞれの型への変換がルールにしたがって自動で行われます。
例えば、HTTPRequestコンポーネントのURLプロパティは文字列となっていますが、HTTPRequest内ではGetString()メソッドを呼び出し文字列を取得しようとします。PreMappingsなどで文字列以外の型の値がURLプロパティに代入されていたとすると、下記ルールに従い文字列に直されてコンポーネントに渡されます。
gval内でも同様の型変換が自動で行われていますが正確なルールは調べていません。ある種のインタプリタ言語に慣れている方には違和感ないルールで変換されているものと思います。
比較演算時や演算子の何が優先されているかとか正確にはわかっていませんが、実際に行ってみて特徴的なところを列挙しておきます(二重引用符は文字列です)。
“true” true -> true true “true” -> true
true "" -> false true 0 -> false
true 1 -> true true 2 -> true
true == -1 -> true
true + 1 -> “true1”
false + 1 -> “false1”
“true” + 1 -> “true1”
“1.1” + 1 -> 2.1
アクションエンジン内型変換ルール
Boolean 数値系は0の時はfalse、それ以外はtrue 日時の時Unix時間で0の時はfalse、それ以外はtrue 文字列の時は“true”/“1“の時はtrue、それ以外はfalse バイト列は文字列に変換後に文字列のルールに従う それ以外の型のときはfalse
整数 Booleanはtrueの時は1、それ以外は0 浮動小数はGo言語のキャストのルール 日時の時はUnix時間を数値とする 文字列の時はstrconv.ParseIntのルールに従う バイト列は文字列に変換後に文字列のルールに従う それ以外の型は0
浮動小数 Booleanはtrueの時は1.0、それ以外は0.0 整数はGo言語のキャストのルール 日時の時はUnix時間を数値とする 文字列の時はstrconv.ParseFloatのルールに従う バイト列は文字列に変換後に文字列のルールに従う それ以外の型は0.0
文字列 Booleanはtrueの時は“true”、それ以外は“false” 整数はstrconv.FormatInt、浮動小数はstrconv.FormatFloatで文字列に直す 日時の時は、time.RFC3339Nanoフォーマットで文字列に直す バイト列はutf-8バイト列とみなし文字列にする。エラーがある場合は空文字 配列、Objectはjson.Marshalをかけて文字列にする
日時 数値系とBooleanは整数に直すルールで整数にした後に、Unix時間とみなして日時に変換 文字列は、下記フォーマットを順に試しできたらそれを日時とみなし、それ以外は0(日時の0とは、1年1月1日00:00:00のこと) time.RFC3339Nano, “2006-01-02T15:04:05.999 MST”, “2006-01-02T15:04:05.999”, “20060102T150405.999 MST”, “20060102T150405.999”, バイト列は文字列に直し文字列と同じルール それ以外は0
バイト列 Booleanと数値系と日時は文字列に直しutf-8バイト列にする 文字列はutf-8バイト列にする 配列、Objectはjson.Marshalを書けて文字列をバイト列にする
配列、Object 数値系と、日時はその値を1つ含む配列にする 文字列は、JSON文字列とみなしjson.Unmarshalする。エラーの場合はサイズ0の配列 バイト列は文字列に直し、文字列と同じルール 配列とObjectはそのまま それ以外の型はサイズ0の配列

Feedback

Was this helpful?

Yes No
You indicated this topic was not helpful to you ...
Could you please leave a comment telling us why? Thank you!
Thanks for your feedback.

Post your comment on this topic.

Post Comment