Each 式
Each 式は一連の値を明確かつ簡潔に識別することを可能にします。それらは一度に複数の値を選択し操作するための強力なメカニズムを提供します。単一の each 式は、簡潔で読みやすい方法で大量の作業を処理します。
each 式の使用方法は二つあります:
- 値のリストを選択または生成するため、
- 値のセットを変更するため。
さらに、選択された値のセットが全て与えられたテストを通過するかどうかをテストするために使用される密接に関連した式のセット(every 式と呼ばれます)があります。
これら三つのメカニズム、つまり"each value"式、"each container"式、および"every"式は、共通点があります。
- これら三つの式のタイプは全て、リストアイテムまたはテキストのチャンクに作用します。頻繁にリストで作業するために使用されますが、行、テキストアイテム、単語、文字、またはパターンの一致または発生など、任意のチャンクタイプで作業するためにも使用できます。
- これら三つの式のタイプは、where 節を使用して作用する値のセットを選択できます。where 節は任意です。それがなければ、式はリスト内の全てのアイテムまたはテキストの全てのチャンクに適用されます。where 節が使用されると、作業する値のサブセットを選択するための明確かつ読みやすい方法を提供します。
値の生成に Each 式を使用する
"each value" 式は常に値のリストを生成します、選択された値が単一であっても全くない場合(空リスト)でもです。
例:
put each item of 1..50 where each is a multiple of 7 -- '[7,14,21,28,35,42,49]'を表示します。
例:
put each item of 1 to 20 where the square root of each is an integer -- '[1,4,9,16]'を表示します。
例:
put "Mary Mary quite contrary how does your garden grow" into rhyme
put each word of rhyme -- '[Mary,Mary,quite,contrary,how,does,your,garden,grow]' を表示します。
put each word of rhyme where the length of each is 4 -- '[Mary,Mary,does,your,grow]' を表示します。
put each word of rhyme where each ends with "ary" -- '[Mary,Mary,contrary]' を表示します。
put the length of each word of rhyme where each ends with "ary" -- '[4,4,8]' を表示します。
put each word of rhyme whose length is 4 and which contains "a" -- '[Mary,Mary]' を表示します。
例:
RunWithNewResults TestScript // TestScriptは実行するスクリプトの名前を含む変数です
put the result into Outcome
put the long name of each of the files of the folder of Outcome's logfile where each ends with ".png" into myfiles // 結果の中のすべてのスクリーンショットへのファイルパスを含むリストを作成します
SendMail {To:"test@gmail.com",Subject:title & "---Test results" ,body:TestScript & "Results"& Outcome,attachment:Outcome's Logfile &&& myFiles}
Each についての 事実
each 式の結果は常にリストです。その最も単純な使用法を考えると、each 式はソース値からの各文字、単語、行、テキストアイテム、またはリストアイテムにアクセスし、それらの値を含むリストを作成します。
where 節は、一定の条件を満たすアイテムを選択することができます。where 節の中では、each 変数は順番にソースからの各値を参照します。where 節が true と評価される値だけが結果のリストに含まれます。
構文:
each chunk of sourceValue {where conditional}
each chunk of sourceValue { { where conditional } }
each chunk of sourceValue { ( where conditional ) }
任意のチャンクタイプ(リストアイテム、テキストアイテム、単語、行、または文字)とともに each 式を使用します。
conditional 式は通常、特殊変数 each を含む式で、これは結果のリストに含める値を選択するために_sourceValue_の各チャンクに設定されます。where 節は、読みやすさやステートメントの他の部分からの分離のために中括弧(または丸括弧)で囲むことができます(互換性のために、every 式とともに中括弧が推奨されます)。
大きな式内の Each 式
each 式が大きな式内に埋め込まれているとき、each 式自体の外側の他の演算子は、each 式によって生成されたリストの値それぞれに適用され、リスト全体に対してではありません。
例:
put the length of each word of "four score and twenty"
-- Each 式はリスト ["four", "score", "and", "twenty"] を生成し、
-- その後、リストの各アイテムに対して length 関数を呼び出します。結果は、
-- 個々の単語の長さのリストです。'[4,5,3,6]' を表示します。
Each 式のスコープを制限する
each 式が影響を及ぼす範囲を広げ、全体の式が結果のリストの各アイテムに適用されるようにするという事実は、その力を大いに増強します。しかし、期待される結果を得るために、この影響を制限することが重要な時もあります。
例:
set text to "the flowers of the forest"
put the number of items in each word of text where the length of each is 3
-- Each 式はリスト ["the","the"] を返し、その後、
-- "アイテム数の"演算子がこのリストの各アイテムに適用されます。
-- 結果として 2つの 1 が得られます (単語 "the" は単一のアイテムです)。
-- リスト '[1,1]' を表示します。
each 式の影響範囲を制限するために括弧を使用します。
例:
put ("Mars","Venus","Saturn") into planets
put the number of items in each item of planets where the length of each is greater than 4
-- リスト '[1,1]' を表示します
put the number of items in (each item of planets where the length of each is greater than 4)
-- "アイテム数の" が each 式の結果全体、つまりリストに適用されるようにします。
-- これにより、リストの単語の数が4以上のものが得られます。
-- '2' を表示します。
For Each 式を使用してスコープを拡張する
括弧が each 式のスコープを制限するという事実は、使用可能な表現の種類を制限します。例えば、括弧を使用して関数を呼び出し、それを各値に適用することはできません。なぜなら、括弧は each 式のスコープを制限するため、関数は結果のリスト全体に対して呼び出されるだけで、各値には呼び出されません。
この問題を克服するために for each 式を使用できます。
例:
put round(each,1) for each item of 2.2 to 3.1 by .25 -- Displays '[2.2,2.5,2.7,3]'
ここでは、特別なeach変数を使用した表現が与えられ、その後にfor eachから始まるeach表現が続きます。for eachの前に来る表現には特別な制限はありません、そしてeach変数を一度以上使用することができます。この例は、実行可能な操作の種類に完全な柔軟性を提供します。
例:
set text to "an ancient anteater sat with my antiquarian aunt"
put "Longest words in text:"
get each & " has " & length(each) & " letters" for each word of text where length(each) > 4
put it joined by return
上記のSenseTalkコードは、実行されると以下のように表示されます:
Longest words in text:
ancient has 7 letters
anteater has 8 letters
antiquarian has 11 letters
構文:
resultExpression for each chunk of sourceValue {where conditional}
resultExpression ( for each chunk of sourceValue {where conditional} )
_resultExpression_は、通常も特別なeach変数を使用する表現です。それはeach表現によって生成された各値に対して評価され、全体の表現の最終的な値のリストを生成します。for each節は、読みやすさを強化するためや、他のステートメントの部分から分離を提供するために、括弧で囲むことができます。
_conditional_表現は、通常、特別なeach変数を含む表現で、_sourceValue_の各チャンクに設定され、結果リストに含める値を選択するために使用されます。
ネストしたEach表現
each