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