プロパティリスト
プロパティリストはリストと似ていますが、プロパティリストとリストはともに値のコレクションです。基本的な違いは、リストが単純な値のシーケンスであるのに対し、プロパティリストの各値はそのキー
と呼ばれる名前またはラベルで識別されるという点です。プロパティリストの操作についての詳細は、Property List Operatorsを参照してください。
例:
put {x:5,y:12} into myPropList // このプロパティリストには2つのキー、xとy、およびそれぞれに対応する2つの値、5と12が含まれています。
もう1つの違いは、あまり明らかでないかもしれませんが、それがもっと重要であるかもしれません。それは、プロパティリストがSenseTalk オブジェクト
の最も単純な形式であるということで、これはプロパティだけでなく振る舞いも持っているということを意味します。このセクションの残りの部分では、主にデータコンテナとしてのプロパティリストを説明します。オブジェクトについての完全な情報については、Objects and Messagesを参照してください。
リストとプロパティリストはパラメータとして渡すことができます。パラメータとしてリストを渡す方法については、Parameters and Resultsを参照してください。
プロパティリストの作成
プロパティリストを作成するには、各プロパティのキーと値を入力し、それを中括弧で囲みます。各プロパティのキーはその関連する値の前に来て、コロンで区切られ、キー/値のペアはカンマで区切られます。
Eggplant Functional 20.1以前は、リストとプロパティリストの両方がデフォルトで括弧()を使用していました。それに対して、今は角括弧[]または中括弧を使用します(それぞれに対して)。括弧はまだプロパティリストの有効な構文と見なされていますが、それらの使用は混乱を招く可能性があるため、推奨されていません。
例:
put {name:"Elizabeth", age:14} into daughter
空のプロパティリストを指定するには、中括弧内にコロン{:}
を使用するか、フレーズempty object
またはempty property list
を使用します。
例:
put {:} into newPlist
プロパティリスト(それがオブジェクトであるため)は、テキストファイルで定義されたオブジェクトなど、他のオブジェクトによってhelpedすることができます。
例:
put {name:"Hank", age:47} helped by parent,actor into candidate
リストは行の続行(“\”)文字を使用せずに複数の行にまたがることができます:
set detective to {name: "Sherlock Holmes",
address: "221 B Baker Street, London",
remarks: "Enjoys playing violin, solving mysteries"}
プロパティリストは、中括弧 { } の代わりに括弧 () を使用することもできます。括弧を使用する場合、プロパティリスト全体が単一の行に表示される必要があります:
例:
put (beverage: "milk", food: "chocolate chips") into groceries
プロパティリストが通常のリストの最後のアイテムとして発生すると、プロパティリストの周囲から中括弧を省略することができます。このアプローチは、リスト/プロパティリストのハイブリッドのような構文をもたらしますが、名前付きプロパティは最後に来なければなりません。以下の2行は同等です:
例:
put [5, 12, {color:"Green", size:42}]
put [5, 12, color:"Green", size:42]
プロパティキー
すべてのプロパティ名(キー)はテキスト文字列です。プロパティ名が次の条件を満たす場合は、特別な処理をせずにキーを入力することができます。それは:(a) アルファベット文字またはアンダースコアで始まる場合、及び (b) アルファベット文字、数字、アンダースコアのみを含む場合です。スペースや特殊文字を含むキーを使用する場合、または数字で始まるキーを使用する場合は、キーを引用符で囲む必要があります。
例:
set oddPlist to {alpha:"ok", "87":"four score and seven", "$":50}
さらに柔 軟性を持たせるために、括弧で囲まれた式を使用してキーを指定することもできます。この機能の最も一般的な使い方は、変数の値をキーとして単純に使用することですが、任意の式を使用することができます。
例:
if typeCode is 1 then set leaveType to "vacation" else set leaveType to "sick"
set leaveInfo to {employee:name, date:today, (leaveType):hoursTaken}
ここでは、3つのキー:"employee", "date", そして typeCode
変数の値に応じて "vacation" または "sick" を持つプロパティリストが作成されます。
重複キーと DuplicatePropertyKeyMode グローバルプロパティ
プロパティリスト内でキーが繰り返される場合、SenseTalkはduplicatePropertyKeyModeグローバルプロパティを使用して何が起こるかを制御します。デフォルトの設定では例外がスローされます。しかし、最初または最後の値を取るように、またはすべての値をリストに追加するように値を変更することができます。
このグローバルプロパティについての詳細は、duplicatePropertyKeyMode
を参照してください。
プロパティリストの内容
リストと同様に、SenseTalkではプロパティリストに任意のタイプの値を含めることができます。これには、リストや他のプロパティリストも含まれます。
値を割り当てる際に、式を使用することができます:
例:
put {label:12592-A,
area:pi*r^2,
dimensions:[9,8,42],
color:{top:"Red", sides:"Black"} } into currentPart
プロパティリストは順序が決まっていないため、プロパティリストを表示する際、例えば log
や put
コマンドを使用すると、SenseTalkはキーをアルファベット順に表示します。
例:
set Features to {width:9 inches,ports:16,hues:4}
log Features // Displays '{hues:"4", ports:"16", width:"9 inches"}'
プロパティリスト内のプロパティへのアクセス
プロパティリスト内のプロパティにアクセスするには、いくつかの異なる方法を使用できます。ドット (.
) やアポストロフィ-S ('s
)、そして of
構文を使用すると、SenseTalkの特殊なメカニズムが起動され、これを使用して要求されたプロパティにアクセスするか、オブジェクトの関数を呼び出します。 property ... of
構文は常にプロパティにアクセスします(関数を呼び出すことはありません)。
単純なプロパティリストのプロパティにアクセスする場合、上記のそれぞれの構文の効果は同じです:それぞれが特定のプロパティにアクセスします。プロパティ名はケースに敏感ではありません。
例:
put {firstName:"Joseph", age:50} into joe
put property age of joe // 50
put the AGE of joe // 50
put joe's firstName // Joseph
put joe.firstName // Joseph
例:
log evaluateProduct(price:49.99,category:"toys",name:"lego set #12332") // 関数ハンドラー "evaluateProduct" にプロパティのリストを渡します
function evaluateProduct ProductInfo // パラメータ "ProductInfo" を持つ関数ハンドラ "evaluateProduct" を宣言します。このパラメータは渡されたプロパティリストを受け取ります。
if ProductInfo.category is "toys" or ProductInfo.category is "books"
if ProductInfo.price is greater than 20 then
return ProductInfo.Name & " は高すぎます。"
else
return ProductInfo.Name & " の価格は適切です。"
end if
else
throw "不明な製品カテゴリ。", "Category: " & ProductInfo.category
end if
end evaluateProduct
変数を使用してプロパティリストのキーを参照する
変数を使用して、プロパティ リスト内のプロパティ値にアクセスできます。これらの形式のいずれかで変数 (または式) の値をプロパティ名として使用するには、変数名を括弧で囲む必要があります。変数名を括弧で囲まない場合、SenseTalk はそれをアクセスするプロパティ (または関数) のリテラル名として扱います。
例:
put {firstname:"Joseph", age:50} into joe
put "Olivier" into joe.LastName
put joe —> {age:50, firstname:"Joseph", LastName:"Olivier"}
未定義のプロパティ
プロパティリストで設定されていないプロパティにアクセスすると、空が返されます。ただし、グローバルプロパティ the strictProperties
が true
に設定されている場合は例外です。the strictProperties
が true
である場合、事前に設定されていないプロパティにアクセスしようとすると例外がスローされます。 the strictProperties
のデフォルト値は false
です。
例:
put {name:"Whiskers"} into myCat
put the color of myCat // デフォルトでは何も表示されません(空)
リストとして複数のプロパティにアクセスする
キーのリストを指定することで、一度に複数のプロパティを値のリストとしてアクセスすることができます:
例:
set pitch to {a:440, b:493.88, c:523.25, d:587.33, e:659.26}
put pitch's [e,d,c,d,a] // [659.26,587.33,523.25,587.33,440]
要求された順序で値を取得します:
例:
put {color:"blue",tvshow:"X-Files",hobby:"skiing",movie:"Independence Day"} into favoriteList
put favoriteList's ["hobby", "color", "movie"] // Displays the list '[skiing,blue,Independence Day]'
プロパティ値の設定または変更
プロパティリストのすべてのプロパティはコンテナーなので、SenseTalkは、put
、add
、sort
などのコンテナの内容を変更する任意のコマンドがプロパティの値を変更することを許可します:
例:
put {firstname:"Joseph", age:50} into joe
put "ine" after joe's firstName // "Joseph"を"Josephine"に変更します
subtract 7 from the age of joe // 結果として、Joeの年齢の値は43になります
put joe --> {age:43, firstname:"Josephine"}
新しいプロパティの追加
プロパティリストに新しいプロパティを追加するには、単に存在しないプロパティに何かを格納します(値を既存のプロパテ ィに格納すると、その現在の値が新しい値で置き換えられます)。
例:
put {firstname:"Joseph", age:50} into joe
put "Olivier" into joe.LastName
put "Tabby" into the name of joe's cat // Results in the property list '{age:"50", cat:{name:"Tabby"}, firstname:"Joseph", LastName:"Olivier"}'
SenseTalkは必要に応じてネストしたプロパティリストを自動的に作成します:
例:
put {firstname:"Joseph", age:50} into joe
put "Olivier" into joe.LastName // 'LastName' プロパティを追加します
put "Tabby" into the name of joe's cat // ネストされた 'cat' プロパティリストを作成し、その名前を"Tabby"に設定します
put joe --> {age:50, cat:{name:"Tabby"}, firstname:"Joseph", LastName:"Olivier"}
キーのリストを指定することで、一度に複数の新しいプロパティを追加できます:
例:
put {firstname:"Joseph", age:50} into joe
put "ine" after joe's firstName // Changes "Joseph" to "Josephine"
subtract 7 from the age of joe // Results in the value of joe's age being 43
複数のプロパティを一度に追加する別の方法は、adding properties
演算子または add properties
コマンドを使用することです。このコマンドは、あるプロパティ リストから別のプロパティ リストからプロパティを追加します。
例:
put {firstname:"Joseph", age:50} into joe
add properties {lastname:"Jones", age:34} to joe
put {firstName:"Joseph", age:50} into joe
既存のプロパティを新しい値で上書きするには、単純に新しい値をプロパティに格納します。または、adding properties
の代わりにreplacing properties
演算子やreplace properties
コマンドを使用します。
例:
put {firstname:"Joseph", age:50} into joe
replace properties {lastname:"Jones", age:34} in joe
put joe --> {age:34, firstname:"Joseph", lastname:"Jones"}
プロパティの削除
delete
コマンドを使用して、プロパティリストから既存のプロパティを削除します。
例:
put {school:"West Elementary",hobbies:"fishing"} into joe
delete joe.hobbies // Results in the property list '{school:"West Elementary"}'
removing properties
演算子やremove properties
コマンドを使用して、一度に複数のプロパティを削除します。
例:
put {barExamStatus:"passed", honors:"summa cum laude", LSAT:"170",internshipStatus:"completed"} into newHireRequirements
put {honors:"magna cum laude",barExamStatus:"passed"} into Executive
remove properties of Executive from newHireRequirements// Results in the property list '{internshipStatus:"completed", LSAT:"170"}'
put newHireRequirements --> {internshipStatus:"completed", LSAT:"170"}
put newHireRequirements removing property "internshipStatus" // Displays '{LSAT:"170"}'
ソースプロパティリストに存在しないプロパティを削除しても影響はありません。
retain properties
コマンドは、明示的に保持されるようリクエストされていないプロパティをすべて削除します。
例:
put {dance:"fox trot",song: "Ain't That a Kick in the Head", partner:"Bob"} into DanceProgram
retain properties ["song","dance"] of DanceProgram //プロパティ リスト '{dance:"fox trot", song:"Ain't That a Kick in the Head"}' の結果
プロパティリストのプロパティを数える
number
関数を使用して、プロパティリストに何個のプロパティがあるかを、キー、値、またはプロパティの数を問い合わせることで調べます。
例:
put the number of keys in {x:5,y:12} -- 2
put the number of values in phoneBook into phoneCount
number of occurrences
関数は、特定の値やキーが何回存在するかを数えます:
例:
put the number of occurrences of 5 among the values in {x:5,y:12} -- 1
プロパティ名のリスト化:Keys関数
keys
関数は、プロパティリストのプロパティの名前をアルファベット順のリストで提供します:
構文:
{the} keys of objectOrPropertyList
keys( objectOrPropertyList )
例:
put {barExamStatus:"passed", honors:"summa cum laude", LSAT:"170",internshipStatus:"completed"} into newHireRequirements
put the keys of newHireRequirements // Displays the list '[barExamStatus,honors,internshipStatus,LSAT]'
例:
set mike to {current:["Mike and the Mechanics","Genesis"],previous:"Red 7"}
repeat with each item of keys(mike)
put it & ": " & property (it) of mike
end repeat
// current: [Mike and the Mechanics,Genesis]
// previous: Red 7
例:
put {testA:"Windows",testB:"Linux"} into testSet
repeat with each item test of keys(testSet)
Log "Running"&&test
RunWithNewResults "LoginTestCase", property (test) of testSet
end repeat
プロパティ値のリスト化:KeyForValue関数とAllKeysForValue関数
keyForValue
関数を使用して、プロパティリストの特定の値に対応するキーを返します。プロパティリストがその値を含まない場合、関数は空を返します。指定された値に等しいプロパティが複数ある場合、その値のキーのいずれかが返されます。
構文:
keyForValue( objectOrPropertyList , aValue )
objectOrPropertyList . keyForValue( aValue )
例:
set myPets to {cat:"Yellow", dog:"Black"}
put keyforvalue(myPets, "Black") -- dog
put myPets.keyForValue("Yellow") -- cat
Behavior: allKeysForValue()
関数は、特定の値を持つプロパティ リスト内のすべてのキーのリストを、特定の順序なしで返します。プロパティ リストにその値が含まれていない場合は、空のリストが返されます。
構文:
allKeysForValue( objectOrPropertyList , aValue )
objectOrPropertyList . allKeysForValue( aValue )
例:
set letterCounts to {A:7, B:2, C:3, D:3, E:7, F:3}
put allKeysForValue(letterCounts, 3) --> ["D","C","F"]
put letterCounts.allKeysForValue(7) --> ["E","A"]
プロパティ値のリスト: Values
関数
動作: values
関数を使用して、プロパティリスト内のすべてのプロパティの値のリストを取得します。SenseTalkは、キーをアルファベット順にリストします。
構文:
{the} values of objectOrPropertyList
values( objectOrPropertyList )
例:
set mike to {current:["Mike and the Mechanics","Genesis"],previous:"Red 7"}
put the values of mike // Displays the nested list '[[Mike and the Mechanics,Genesis],Red 7]'
例:
set mike to {current:["Mike and the Mechanics","Genesis"],previous:"Red 7"}
repeat with each item of mike's values
if it contains "Genesis" then log "Found it."
end repeat
values関数に1つ以上のプロパティ名やプロパティ名のリストを渡すと、リクエストされた順序でリクエストされたプロパティ値のみをリストします:
例:
put {color:"blue",tvshow:"X-Files",hobby:"skiing",movie:"Independence Day"} into favoriteList
put favoriteList's ["hobby", "color", "movie"] --> ["skiing","blue","Independence Day"]
プロパティリストのプロパティを順番に処理する
repeat with each
ループを使用して、プロパティリストの値を1つずつ処理します。特殊なit
変数を使用して、現在のキーを参照できます。
例:
set phoneBook to {Mark:"555-1234", John:"555-2345", Eli:"555-3456"}
repeat with each of the keys of phoneBook
set value to phoneBook.(it)
put key & ":" && value-- work with
end repeat
プロパティを反復処理しながら、キーと値の両方を取得することもできます。これを行うには、repeat with each
コマンドで 2 つの変数のリストを指定します。最初の変数はキー用、2 番目の変数は対応する値用です。
例:
set myEnvironments to {WindowsVM:("Chrome","Firefox","Internet Explorer"),LinuxVM:("Chrome","Firefox"),MacOSXVM:("Chrome","Safari","Firefox")}
repeat with each SUT of the keys of myEnvironments // Iterates through LinuxVM, MacOSXVM, and finally WindowsVM, following alphabetical order of the keys
Connect SUT
repeat with each Browser of BrowserList // Iterates through each item in the list that was pulled in as the property list value
RunWithNewResults "WebTest", Browser
end repeat
end repeat
2 つの変数名のリストを指定すると、次の例の 2 番目の繰り返しループに示すように、プロパティ リスト内のキーと関連付けられた値を一度に反復処理できます。:
例:
put "A single question can be more influential than a thousand statements." into quotation
// 引用文中の各文字の出現回数を数えます。
set characterTally to {:}
repeat with each character of quotation
if it is a letter then add 1 to characterTally.(uppercase of it)
end repeat
repeat with each [char,count] of characterTally
put !"[[char]] : [[count]]"
end repeat
プロパティリストにキーまたは値が存在するかを確認する
is among
オペレーターを使用して、プロパティリストが特定のキーまたは値を含んでいるかどうかを確認します。
例:
put "x" is among the keys of {x:5,y:12} // Displays 'true'
例:
put 12 is among the values of {x:5,y:12} // Displays 'true'
例:
put the first item of the folders of "C:\Users\Carrie\Desktop\" into myFolder // デスクトップ上の最初にリストされているフォルダを表すオブジェクト (プロパティ リスト) を変数に格納します。
put "NSFileType" is among the keys of myFolder // 'true' が表示されます
特定の状況では、 contains
や is in
オペレーターを使用します。これらのオペレーターの意味は、プロパティリストと一緒に使用する場合、オブジェクト自体で定義できます。あるいは、 the objectContainsItemDefinition
グローバルプロパティを設定することで設定できます。しかし、プロパティリストで contains
や is in
オペレーターを使用するデフォルトの動作は、プロパティリストのテキスト値の部分文字列をチェックすることです。
例:
set PersonalInfo to {asText:"Robert",age:31,hair:"brown",height:"5 feet 11 inches",degrees:["BS","MS"]}
put "hair" is among the keys of PersonalInfo // 'true'を返します
put PersonalInfo contains "hair" // プロパティリストのテキスト値が "Robert" であるため、'false' を返します
set the objectContainsItemDefinition to KeyorValueEquals
put "hair" is in PersonalInfo // hairはプロパティリストのキーであるため、'true'を返します
put "BS" is in PersonalInfo // "BS"はプロパティリストのキーでも値でもないため、'false'を返します
set the objectContainsItemDefinition to NestedValueContains
put PersonalInfo contains "BS" // "BS"はプロパティリストのネストされた値であるため、'true'を返します
プロパティリストをテキストに変換する
プロパティリストがテキストとしてアクセスされる(put
コマンドによって表示されるなど)場合、SenseTalkはそれをテキスト表現に変換します。プロパティリストがテキストに変換されると、SenseTalkはリスト内の各値をテキスト表現に変換します。これがどのように行われるかの詳細については、Conversion of Valuesを参照してください。
プロパティリストに asText
プロパティが含まれている場合、SenseTalkはそのプロパティの値をオブジェクトのテキスト表現として使用します。
例:
set Color to {asText:"Pink","Candy Floss":424,"Warley Rose":874,"Alyssum Wonder":737}
log Color // 'Pink'を表示
プロパティリストが asText
プロパティを含んでいないが、asTextFormat
プロパティを含んでいる場合、SenseTalkはその値をマージフォーマットとして使用してテキスト表現を生成します。マージフォーマットの説明については、merge functionを参照してください。asText
や asTextFormat
プロパティなどの特別なプロパティについての情報は、Special Properties または Displaying Objects as Textを参照してください。
例:
set SoupduJour to {temperature:"cold",base:"tomato",asTextFormat:"Today's soup is a [[my temperature]] soup with a [[my base]] base."}
Log SoupduJour // 'Today's soup is a cold soup with a tomato base.'と表示されます。
asText
または asTextFormat
プロパティが存在しない場合、SenseTalkはデフォルトで the propertyListFormat global property
の値を使用してテキスト表現を作成します。詳細については Displaying Objects as Text および Object Properties を参照してください。
このデフォルトのテキスト表現は、propertyListFormat
のprefix
およびsuffix
プロパティの値(デフォルトでは開き中括弧と閉じ中括弧)で囲まれています。プロパティは、keySeparator
(デフォルトではコロン)でキーと値が区切られ、キー/値のペアはentrySeparator
(デフォルトではカンマ)で区切られます。値は引用符で囲まれています。
空のプロパティリストのデフォルトのテキスト表現は、emptyRepresentation
プロパティによって与えられます(デフォルトでは"{:}"です)。propertyListFormat
のこれらの値を設定することで、デフォルトの書式設定を変更することができます。これらの値は、empty
を含む好きなテキストに設定することができます。
例:
set the propertyListFormat to {prefix:empty,suffix:empty,keySeparator:"#",entrySeparator:","}
set beverages to {water:"cold",tea:"hot"}
log beverages // Displays 'tea#hot,water#cold'
例:
set the propertyListFormat to {prefix:"The value of", keySeparator:"is", entryseparator: "and the value of", suffix:".",emptyRepresentation:"the value is empty."}
put {x:12,y:13} // Displays 'The value of x is "12" and the value of y is "13"'
スクリプトやヘルパーを含むプロパティリストを含むオブジェクトは、asText
メッセージを処理して自身のテキスト表現を提供することで、このメカニズムを完全にオーバーライドすることができます。詳細については Objects and Messages を参照 してください。
プロパティリストのすべてのキーと値のテキスト表現を取得するには、standardFormat
関数を使用して、ファイルに保存するのに適したプロパティリストの標準化された表現を生成します。このテキストは、そのテキストが value
関数によって評価されると、元のプロパティリストを再度生成する形式であります(Conversion of Valuesを参照)。
例:
put "C:\Users\Carrie\Desktop\Color.txt" into ColorsFile
put standardformat("Candy Floss":424,"Warley Rose":874,"Alyssum Wonder":737) into file ColorsFile
put value(file ColorsFile) into tempData
log tempData's "Warley Rose" // '874'を表示する
テキストをプロパティリストに変換する
Working with Text で詳しく説明されている split
、join
コマンド、asText
関数、および対応する split by
および joined by
演算子(Expressionsで説明されています)は、テキストをプロパティリストに明示的に変換する方法とその逆を提供します。
例:
put line 1 of file resourcePath("locations.txt") into Locations // Locations.txt の1行目にはプロパティリストではなく、文字列が格納されており、その形式は 'Colorado:Fort Collins,Michigan:Lansing,Oregon:Bend' となっている
split Locations using "," and ":" // Locations 内の文字列をカンマとコロンを基に分割し、適切なプロパティリストに変換する
repeat with each of the keys of Locations // Locations をプロパティリストに変換したことで、そのキー(Colorado、Michigan、Oregon)を反復処理できるようになる
If it is "Oregon" then TypeText Locations.(it) // SUT に "Bend" を入力する
end repeat
value function を使用して、standardFormat function に従う文字列をプロパティリストに戻すことができます。このアプローチは、プロパティリスト情報を外部データファイルに保存する際に便利です。
例:
repeat with each line Salary of file resourcePath("SalaryList.txt") // データファイルからの入力は常に文字列です。この場合、文字列は標準形式 '{Bob:@"$100,000.00"}' で保存されています
put value(Salary) into CurrentSalary // 文字列を標準形式に従って評価し、自動的にプロパティリストに変換します
put the keys of CurrentSalary // CurrentSalaryには真のプロパティリストが保存されているので、そのキーにアクセスすることができます
end repeat
asObject
関数(通常は as a property list
や as an object
演算子によって呼び出されます)は、標準形式の文字列をプロパティリストに変換するための別の方法で、最も単純なタイプのオブジェクトです。
例:
put line 1 of file resourcePath("SalaryList.txt") as a property list into Salary // データファイルは、標準形式でプロパティリスト '{Bob:@"$100,000.00"}' を保存しています
Log "The salary is "&Salary.bob&"." // Logs "The salary is $100,000.00."
オブジェクトとメッセージ
このセクションの情報では、主にプロパティ リストをデータ コンテナーとして使用する方法について説明しました。プロパティ リストは、値を構造的に保存する方法を提供するだけでなく、関連する動作を持つことができる SenseTalk オブジェクトでもあります。オブジェクトとしてのプロパティ リストを完全に理解するには、メッセージとハンドラー、およびオブジェクトとそのヘルパーとい う、さらにいくつかの概念を習得する必要があります。
Objects and Messages - オブジェクトという強力な概念を紹介し、それらを作成し、そのプロパティにアクセスし、それらにメッセージを送る方法を説明します。オブジェクトが他のオブジェクトを"支援"することを可能にするオブジェクトヘルパーも説明されています。