範囲
範囲の定義
例:
put 1 to 100 into firstHundred
set validRange to 100..200
範囲には、ワード「by」、「step」、または「step by」を使用して、必要に応じて刻み値を含めることができます(刻み値の使用は、以下の「範囲の使用によるリストの生成」で説明します)。
例:
put 1 to 99 step by 2 into oddNumbers
set evenNumbers to 0..100 by 2
技術トピック
構文: {from} startValue [ to | .. ] endValue { [{step{ping}} {down} by | step] stepValue }
範囲の簡単な使用
最も簡単な使用では、範囲によって2つの値が指定されます。 その範囲のプロパティとして、開始値および終値に直接アクセスできます。
例:
set myRange to 10 ..20 -- (10 to 20)
put myRange.start -- 10
put myRange's end -- 20
is within演算子を使用すると、ある値がその範囲に含まれるかどうかを検証できます。
例:
put 13 is within myRange -- true
put 18.975 is within myRange -- true
put 9.2 is within myRange -- false
範囲は包含的であり、その範囲には開始値と終値の両方が含まれます。 そのため、値10と値20を含む10から20の間の任意の値は、例の範囲に収まります。
例:
put 10 is within myRange -- true
put 20 is within myRange -- true
is a range演算子を使用すると、ある値が範囲であるかどうかを検証できます。
例:
put myRange is a range -- true
範囲の利用によるリストの生成
シーケンスジェネレータとして範囲を使用すると、その範囲の開始値で始まり、その終値まで続く値のシーケンスまたはリストが自動的に生成されます。 範囲にその値を生成させる一番簡単な方法は、リストの存在が予想されるコンテキスト内で範囲を使用することです。
例:
put item 5 of 10 to 20 -- 14
put the last 3 items of 100..200 by 2 -- (196,198,200)
その範囲に対して増分により刻み値を指定する場合は、リスト内の連続するアイテム間の増分としてシーケンスを生成する際に、その絶対値(正値)が使用されます。 その範囲に対して増分により刻み値を指定しない場合は、値1が想定されます。 範囲の刻み値のプロパティを利用して、範囲の増分値へのアクセスや変更を行うことができます。
例:
set the step of myRange to 3
範囲内のすべての値を一度に生成するには、as list演算子を使用してこれをリストとしてリクエストします。
例:
put 10..20 as a list -- (10,11,12,13,14,15,16,17,18,19,20)
put 10 to 20 by 2 as list -- (10,12,14,16,18,20)
どちらかの順序で範囲の終点を指定します。 例:10から20まで、または20から10までの範囲。 is within演算子の目的のために、この2つは等価となります。 違いは、範囲をリストとして扱う場合やイテレータとして使用する場合に、値が生成される順序です。
例:
put 20 ..10 by 2 as a list -- (20,18,16,14,12,10)
containsおよびis in演算子の範囲との併用
containsおよびis in演算子を範囲と併用する場合は、本演算子は範囲をリストとして扱います。 本ケースでは、ある値がその範囲によって生成された値の1つであることが明確な場合に、範囲にはその値のみが含まれます。
set range to 10..20
put range contains 13 -- true
put range contains 13.5 -- false
put 13.5 is within range -- true (13.5 is between 10 and 20)
put 13.5 is in range -- false(次のどの値でもないため:10、11、12、13、14、15、16、17、18、19、20)
日付/時間範囲
日付または時間範囲は、数値範囲と同じように振る舞います。 それを時間範囲として認識させるには、開始値および終値の両方が日付または時間値として有効である必要があります。
例:
set Q1 to "Jan 1" to "Mar 31"
put "Feb 3" is in Q1 -- true
刻み値を明示的に指定せずに時間範囲を作成する場合は、刻み値は開始値と終値に応じて、1日、1分、または1秒と仮定されます。
- 開始値と終値が1日以上離れている場合は、1日の刻み値が使用されます。
- 開始値と終値がそれぞれ24時間以内にあり、かつ1分以上離れている場合は、1分の刻み値が使用され、
- 範囲が60秒以下の場合は、1秒の刻み値が使用されます。
日付/時間範囲をより自然で読みやすくするには、「1 day」の代わりに「days」、「1 minute」の代わりに「minutes」など、複数形の時間単位の刻み値を指定します。
例:
set MondaysIn2009 to "2009-01-05" to "2009-12-31" by weeks
リストとして日付/時間範囲にアクセスする場合、生成した各値は、開始値と同じフォーマットを使用する日付/時間値となります。
例:
put item 33 of "Jan 1" to "March 31" -- "Feb 2"
put item 33 of "January 1" to "Mar 31" -- "February 2"
文字範囲
範囲を使用してUnicode文字の範囲を指定することも可能です。 文字範囲の一般的な使用に、アルファベットの指定があります。
例:
set alphabet to "a".."z"
set upperAndLowerLetters to "A".."Z" &&& "a".."z"
put "z" to "t" as list -- ("z","y","x","w","v","u","t")
Chunk Indexとしての範囲の使用
範囲を使用して、ある値の特定の文字、ワード、アイテム、またはその他の一部分を選択できます。
例:
put chars 1..5 of "abcdefgh" -- "abcde"
put chars 1..5 by 2 of "abcdefgh" -- "ace"
put items 2..6 by 2 of "a,b,c,d,e,f,g,h" -- "b,d,f"
put items 2..6 by 2 of (a,b,c,d,e,f,g,h) -- (b,d,f)
put chars 8..1 of "abcdefgh" -- "hgfedcba"
put chars 8..1 as list of "abcdefgh" -- (h,g,f,e,d,c,b,a)