如何与无比较

时间:2015-03-20 23:40:48

标签: rebol

我有以下数据块:

client: ["id" "1234" "name" "foobar" "custom_ip" none]

奇怪的是,与“无”相比似乎无法发挥作用。

if none = (select client "custom_ip") [print "YAY!"]

虽然当我print select client "custom_ip"时它返回“无”。

这是为什么?我该怎么做才能确定该值是否为空?

2 个答案:

答案 0 :(得分:3)

NONE!类型的文字值与WORD之间存在差异!使用拼写NONE

一个人可以(理所当然,IMO)将它称为控制台在为您提供表达式输出时不区分这些错误的错误:

>> none  ;-- a word! that will be looked up to get its value
== none  ;-- that value, and it's *not* actually a word!

为了从控制台获得none单词在这种情况下评估的值的欺骗性较小的响应,我们可以使用mold / all

>> print mold/all none
== #[none]

或者你可以只显示结果的类型而不是结果本身:

>> type? none
== none!

虽然出于类似的原因,它在某种意义上具有欺骗性,因为它看起来像没有!当它实际上是一种数据类型......

>> type? type? none
== datatype!

无论如何,你在你的例子中实际得到的是单词none,因此:

>> if 'none = (select client "custom_ip") [print "OH..."]
OH...

除了控制台输出外,它做了一个可预测的事情。目前Rebol3中的#[none]实际上是#的字面非格式的简写:

>> client: ["id" "1234" "name" "foobar" "custom_ip" #]
>> if none = (select client "custom_ip") [print "HMM..."]
HMM...

但是构造语法一般是不变的;所以很难说最终答案是什么。

尽管有基本的控制台狡猾的输出,但大多数情况下只要注意单词NONE和NONE!类型之间的区别。 (我提到Ren Garden,例如,使用MOLD / ALL)

答案 1 :(得分:1)

有关说明,请查看@ HostileFork的答案,这里只是我会在这种情况下使用的一些代码:

unless get select client "custom_ip" [print "YAY!"]

请参阅GET功能以评估无字!。