3

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有什么意义!对于字有?

4

2 回答 2

5

IN 函数主要不是用于在对象中搜索单词,而是用于返回对象中的单词或单词块,或绑定到对象的 Rebol 术语。它是 BIND 函数的变体,在与 BIND 不同的情况下很有用。

如果对象中没有该名称的单词,则它不返回任何单词,这很明智。这给它带来了可以在条件表达式中用作单词检测功能的附带好处,但这不是它的主要用途。

IN 可以将对象块作为其对象参数,然后尝试依次将单词绑定到每个对象,返回绑定到块中具有该单词的第一个对象的单词。这意味着对 Rebol 3 GUI 的旧设计进行覆盖字查找的相对快速的方法,但在这种情况下它被证明不是最好的方法,因此 GUI 现在不使用该设计。然而,IN块词被保留为一个潜在有用的特征,以备将来在其他地方使用。

在您的示例中,该块中没有对象,因此 IN 无法将单词绑定到任何对象。这就是 IN 没有返回的原因。

如果您为 word 参数传递一个块,它会在返回之前将该块绑定到对象。这是为了允许像do in obj [print a]. 虽然它没有做bind/copy,所以你应该小心这样的代码。或者也许 IN对象块应该复制 - 改变它是否为时已晚?为 word 参数传递一个括号应该与传递一个块具有相同的绑定行为。

当我上次检查时,我们不支持将对象和单词参数都设置为块。这是因为我们无法为这种行为应该是什么找到一个好的模型,至少很明显。压倒一切的单词查找实际上不适用于单词块,因为结果是不确定的。

有一个函数可以按顺序将一个块重新绑定到一系列对象,尤其是对于重新创建 Rebol 的非真正嵌套范围时,这将是有用的,但如果该函数是 IN 会非常令人困惑。

于 2014-01-11T19:52:08.537 回答
2

这可能没有那么有用,但由于没有明确提及,我认为现在是解决您的第一个问题的“正确”方法:

red>> first find [foo: 10 bar: 20] 'foo
== foo:

这在 rebol2 上不起作用,但是quote这样set-word!做:

>> first find [foo: 10 bar: 20] quote [foo:]
== foo:

还是有退货的小缺点set-word!

于 2016-10-01T23:23:50.043 回答