我有以下数据块:
client: ["id" "1234" "name" "foobar" "custom_ip" none]
奇怪的是,与“无”相比似乎无法发挥作用。
if none = (select client "custom_ip") [print "YAY!"]
虽然当我print select client "custom_ip"
时它返回“无”。
这是为什么?我该怎么做才能确定该值是否为空?
答案 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
功能以评估无字!。