如何使用块而不是对象?

时间:2014-01-11 06:17:44

标签: object rebol rebol3

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有什么意义!换言之?

2 个答案:

答案 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!

还有一点点缺点