3

複数のテキスト リストの値を評価するための条件を設定しようとしています。これは、SWITCH を使用して機能します。

options: ["" "" "" ""]

view layout [
    text-list "one" "two" "three" "four" [poke options 1 value]
    button "test" [switch/default options/1 [
        "one" [alert "first"]
        "two" [alert "second"]
        "three" [alert "third"]
        "four" [alert "fourth"]
        ] [alert "pick a number!"]
    ]
]

しかし、これは何らかの理由で機能しません:

options: ["" "" "" ""]

view layout [
    text-list "one" "two" "three" "four" [poke options 1 value]
    button "test" [
        either options/1 <> 0 [
          alert "you have picked a number!"
        ][alert "pick a number!"]
    ]
]

EITHER 評価は、条件として指定した場合は常に最初のブロックを実行options/1 <> 0し、条件として指定した場合は常に 2 番目のブロックを実行options/1 = 0します。

ここで何が問題なのですか?

4

2 に答える 2

3

「何もない」状態を示すために空の文字列を使用しています。@ iceflow19 が指摘するように、文字列と整数が等しく比較されることはありません。文字列が空かどうかを知りたい場合は、EMPTY? を使用します。または文字通りまたはに対して比較し""ます{}

(注:私は通常、波括弧付きの文字列を好みます。{It's cool that they {nest better} and can do "quotes" and apostrophe's [sic] without escaping.}

Rebol には、無を表す別の可能性があり、それは型が NONE! の値です。NONEという素晴らしいプロパティ!値が持っているのは、ロジックのように動作するということです! false 値は、IF、UNLESS、および EITHER に関する限り有効です。

value: none

if value [print {this won't run}]

unless value [print {this will run}]

一部のルーチンは NONE! を使用します。通常の「失敗」状態を示す戻り値として値を返します。IF と UNLESS はそのようなルーチンです:

>> print if 1 < 2 [{math is working}]
math is working

>> print if 1 > 2 [{math is broken}]
none ;-- Rebol2 prints out the string representation of NONE!

(注: Rebol3 では、単一値の場合、IF、UNLESS、または EITHER の条件をブロックに入れる必要はありません。)

したがって、次のように書くこともできます。

options: reduce [none none none none]

view layout [
    text-list {one} {two} {three} {four} [poke options 1 value]
    button {test} [
        alert either options/1 [
            {you have picked a number!}
        ][{pick a number!}]
    ]
]

ブロックはデフォルトでは評価されないため、REDUCE が必要です...そして、 noneという単語が4 回使用されます (NONE がバインドされているタイプ NONE! の値に対して)。

SWITCH または EITHER の結果を alert に渡すことができ、それが実行されるブランチの最後の評価値になることにも注意してください。上記のように、ブランチが実行されない場合は none です。

(注: すぐに必要になる可能性のある構文 (まだ発見していない場合) は、CASE と ALLです。)

于 2015-08-28T19:04:17.773 に答える
2

それは正常に動作します。状態自体が問題です。'value という単語は、文字列値を参照します。(「1」、「2」、「3」、または「4」)

「one」が選択されると、文字列「one」がオプション ブロックの位置 1 に挿入されます。

>> probe options
== ["one" "" "" ""]

>> probe options/1
== "one"

あなたの不等式は文字列型の値を比較しています! 整数型の値 0 に! 文字列が整数と等しくなることはないため、条件は常に true と評価されます。したがって、いずれかの最初のコード パスが常に実行されます。

使用するときは、比較オプション/1 (文字列!) を文字列 "one"、"two"、"three"、"four" に切り替えます。たとえば、options/1 = "two" の場合、最初のケースは "two" <> "one" であるため失敗しますが、2 番目のケースは "two" = "two" (値と型の両方) であるため成功します。

于 2015-08-28T16:29:07.663 に答える