Rebol 的任一条件都无法正常工作

Rebol's either condition not working correctly

我正在尝试设置一个条件来评估多个文本列表的值。这有效,使用 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!"]
    ]
]

如果我把options/1 <> 0作为条件,EITHER评估总是执行第一个块,如果我把options/1 = 0作为条件,总是执行第二个块,这显然不是应该的完全没有工作。

这是怎么回事?

它工作正常,条件本身就是问题。 'value 一词将指代一个字符串值。 ("one"、"two"、"three" 或 "four")

When "one" is selected, it will insert the string "one" into the options block in position 1.

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

>> probe options/1
== "one"

您的不等式正在比较字符串类型的值!到整数类型的值 0!字符串永远不会等于整数,因此条件将始终计算为真。因此,'either 上的第一个代码路径将始终是 运行.

当您使用 switch 时,您会将 options/1(一个字符串!)与字符串 "one"、"two"、"three" 和 "four" 进行比较。例如,如果 options/1 = "two",第一种情况会失败,因为 "two" <> "one",但第二种情况会成功,因为 "two" = "two"(值和类型)。

您正在使用空字符串表示 "nothing" 状态。正如@iceflow19 指出的那样,字符串和整数永远不会相等。如果你想知道一个字符串是否为空,使用 EMPTY?或从字面上与 ""{}.

进行比较

(注意:我自己通常更喜欢花括号,{It's cool that they {nest better} and can do "quotes" and apostrophe's [sic] without escaping.}

Rebol 还有另一种表示虚无的可能性,那就是一个类型为 NONE! 的值。一个 属性 一个 NONE 好!价值在于它会表现得像一个逻辑!就 IF、UNLESS 和 EITHER 而言,false 值是正确的。

value: none

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

unless value [print {this will run}]

有些例程使用 NONE!值作为它们的 return 以指示正常的 "failure" 条件。 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!

(注意:如果 IF、UNLESS 或 EITHER 是单个值,Rebol3 不要求您将条件放入块中。)

所以你可以这样写:

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 是必需的,因为默认情况下不评估块...并且您将 word none 四次(相对于类型 NONE!,绑定了 NONE)。

另请注意,您可以将 SWITCH 或 EITHER 的结果传递给警报,它将是运行的分支的最后评估值。或者 none 如果没有分支运行——如上所示。

(注意:您可能很快就会想要的构造——如果您还没有发现的话——是 CASE and ALL。)