Rebol中的IN函数会发现一个字段是否在对象中:
USAGE:
IN object word
DESCRIPTION:
Returns the word or block in the object's context.
IN is a native value.
ARGUMENTS:
object (any-object! block!)
word -- (modified if series) (any-word! block! paren!)
声称它适用于对象或块。如果我用一个对象尝试它可以正常工作:
>> in object [foo: 10 bar: 20] 'foo
== foo
但是,如果我只是尝试使用原始块,它会返回NONE:
>> in [foo: 10 bar: 20] 'foo
== none
猜猜我是否理解它是否不支持块(Rebol2没有)。但是不会返回NONE允许哪些块的情况是什么呢?
冒着将这两个问题合二为一的风险,接受BLOCK的原因是什么?对于word
参数?如果你有一套你想要的单词,我认为这会有一个障碍,但它似乎只是返回了一个块:
>> in object [foo: 10 bar: 20] [mumble frotz bar]
== [mumble frotz bar]
>> in object [foo: 10 bar: 20] [mumble frotz]
== [mumble frotz]
进一步冒这三个问题的风险,PAREN有什么意义!换言之?
答案 0 :(得分:5)
IN函数主要不是用于搜索对象的单词,而是用于返回在对象中的单词或单词块,或者用于Rebol术语绑定对象。它是BIND函数的一种变体,它在不同的情况下比BIND更有用。
如果对象中没有该名称的单词,则返回none,足够明智。这使得它能够在条件表达式中用作单词检测功能,但这不是它的主要用途。
IN可以为其对象参数获取一个对象块,然后尝试依次将该单词绑定到每个对象,返回绑定到具有该单词的块中的第一个对象的单词。对于Rebol 3 GUI的旧设计来说,这是一种相对快速的方法来覆盖字查找,但事实证明这不是最好的方法,因此GUI现在不使用该设计。但是,IN 块词被保留为将来在其他地方使用的潜在有用功能。
在您的示例中,该块中没有对象,因此IN无法将该单词绑定到。这就是为什么IN没有返回。
如果为字参数传递IN块,它会在返回块之前将块绑定到对象。这是为了允许像do in obj [print a]
这样的代码。它虽然没有bind/copy
,所以你应该小心这样的代码。或者也许IN 对象块应该复制 - 改变它是否为时已晚?传递word参数的paren应该具有与传递块相同的绑定行为。
当我最后检查时,我们不支持将对象和单词参数都设置为块。这是因为我们无法找到一个好的模型来表明这种行为应该是什么,至少显然是这样。最重要的单词查找并不适用于一个单词块,因为结果是不确定的。
有一个函数可以按顺序将一个块反弹到一系列对象,特别是对于重新创建Rebol的非真正嵌套的范围,但是对于该函数来说,这将是非常令人困惑的。
答案 1 :(得分:2)
这可能没那么有用,但由于没有明确提及,我认为是对的'现在解决你的第一个问题的方法:
red>> first find [foo: 10 bar: 20] 'foo
== foo:
这不适用于rebol2 tho,但是quote
set-word!
会这样做:
>> first find [foo: 10 bar: 20] quote [foo:]
== foo:
返回set-word!