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
表現は、別のeach
表現で囲むことができます。これは混乱を招くかもしれませんが、ネストしたリストや他のネストした構造体を扱うときに役立つかもしれません。例えば、各単語の長さを取得する(単一のフレーズではなく、一連のフレーズの各々について)ために、次の例のように行うことができます:
例:
set phrases to {\{
universal truth
magic is in the eye of the beholder
all is fair in love and war
}}
put the length of each word of phrases
-- Displays a single list: '[9,5,5,2,2,3,3,2,3,8,3,2,4,2,4,3,3]'
put the length of each word of each line of phrases
-- Displays a nested list, one list for each line of phrases:
-- '[[9,5],[5,2,2,3,3,2,3,8],[3,2,4,2,4,3,3]]'
put the number of words of each line of phrases
-- Displays the list '[2,8,7]'
ネストしたeach
表現ではwhere
節を使用することができます。各where
を最も近いeach
に合わせることに注意する必要があります。例えば、3文字以上の単語の単語の長さだけを見たい場合、以下の例を使用することができます:
例:
set myData to {\{
elephant
jelly jar
tea
}}
}}
put the length of each word of each line of myData where true where length of each > 3
-- Uses "where true" to indicate interest in the lengths of the individual words
-- rather than the lengths of the lines. Displays the nested list '[[8],[5],[]]'
-- as only the first and second lines have any words with length greater than 3.
put the length of each word of each line of myData where length of each > 3
-- Validates the length of the lines rather than the length of the words within the line.
-- Displays the nested list '[[8],[5,3]]' which contains the lengths of the words only
ここでは、最初の where
句、つまり where true
が必要な理由を説明します。これがないと、他の where
句が各行に適用されますが、行の長さではなく、個々の単語の長さが重要です。