我试图设置一个条件来评估几个文本列表的值。这可以使用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
作为条件,则始终执行第二个块,这显然不是它应该如何工作的所有
这里有什么问题?
答案 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; (无论是价值还是类型)。