Rebol的条件无法正常工作

时间:2015-08-28 11:51:02

标签: conditional-statements rebol rebol2

我试图设置一个条件来评估几个文本列表的值。这可以使用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作为条件,则始终执行第二个块,这显然不是它应该如何工作的所有

这里有什么问题?

2 个答案:

答案 0 :(得分:3)

您正在使用空字符串表示&#34;没有&#34;州。正如@ iceflow19指出的那样,字符串和整数永远不会相等。如果您想知道字符串是否为空,请使用EMPTY?或者按字面意思与""{}进行比较。

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

Rebol有另一种表示虚无的可能性,而且这是一个类型为NONE的值!一个不错的财产,没有!价值就是它会像LOGIC一样!就IF,UNLESS和EITHER而言,假值确实存在。

value: none

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

unless value [print {this will run}]

有些例程使用NONE!价值作为他们的回报,表明正常&#34;失败&#34;条件。 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绑定的NONE!类型的值)。

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

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

答案 1 :(得分:2)

它工作正常,条件本身就是问题。单词&#39;值将引用字符串值。 (&#34;一个&#34;,&#34;两个&#34;,&#34;三个&#34;或者&#34;四个&#34;)

当&#34;一个&#34;如果被选中,它将插入字符串&#34; one&#34;进入位置1的选项块。

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

>> probe options/1
== "one"

你的不平等是比较字符串类型的值!到整数类型的值0!字符串永远不会等于整数,因此条件将始终求值为true。因此,&#39;上的第一个代码路径将始终运行。

当您使用切换比较选项/ 1(字符串!)到字符串&#34;一个&#34;,&#34;两个&#34;,&#34;三个&#34;和&# 34;四&#34 ;.如果选项/ 1 =&#34;两个&#34;例如,第一种情况将失败,因为&#34;两个&#34; &LT;&GT; &#34;一个&#34;,但第二个案例将成功,因为&#34;两个&#34; =&#34;两个&#34; (无论是价值还是类型)​​。