object - 如何将 IN 与 block 而不是对象一起使用?

标签 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!)

声称它适用于对象或 block 。如果我用一个对象尝试它,它就可以正常工作:

>> in object [foo: 10 bar: 20] 'foo
== foo

但如果我只是用原始 block 尝试它,它会返回 NONE:

>> in [foo: 10 bar: 20] 'foo
== none

如果它不支持 block (Rebol2 不支持),我想我会理解的。但是在什么情况下它不会返回允许 block 的 NONE?

冒着将这两个问题合二为一的风险,接受 BLOCK 有什么用!对于 word 参数?如果你有一组你正在寻找的词,我认为它会占用一个 block ,但它似乎只是返回 block :

>> in object [foo: 10 bar: 20] [mumble frotz bar]
== [mumble frotz bar]

>> in object [foo: 10 bar: 20] [mumble frotz]
== [mumble frotz]

冒着提出这三个问题的进一步风险,拿一个 PAREN 有什么意义!对于单词有?

最佳答案

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

如果对象中没有那个名字的词,它返回 none,这很明智。这给它带来了能够在条件表达式中用作单词检测功能的附带好处,但这不是它的主要用途。

IN 可以将一个对象 block 作为其对象参数,然后依次尝试将单词绑定(bind)到每个对象,返回绑定(bind)到 block 中具有该单词的第一个对象的单词。这本来是一种相对快速的方法来为 Rebol 3 GUI 的旧设计进行覆盖单词查找,但结果证明这不是那种情况下的最佳方法,因此 GUI 现在不使用该设计。但是,IN block word 被保留为 future 在其他地方使用的潜在有用功能。

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

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

上次我检查时,我们不支持将对象和单词参数都作为 block 。这是因为我们无法为该行为应该是什么找到一个好的模型,至少显然是这样。覆盖词查找实际上不适用于词 block ,因为结果是不确定的。

如果有一个函数可以按顺序将一个 block 重新绑定(bind)到一系列对象,这将很有用,尤其是对于重新创建 Rebol 的非真正嵌套的作用域,但如果该函数是 IN,那确实会造成混淆。

关于object - 如何将 IN 与 block 而不是对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21059228/

相关文章:

python - 如何拥有默认对象属性并可以选择设置它?

parsing - 有人能模仿R2中的find/any行为吗?

Rebol 3 - 阅读网站

javascript - 挖掘 JavaScript 对象的路径

Django-从模型中的所有对象获取第一个属性

rebol - 将 Rebol csv 工具转换为 Red

android - Android 上的 Rebol GUI 显示屏太小

html - 使用 REBOL 在文件中查找/替换跨行的字符串

rebol - 如何忽略解析时注释掉的行?

java - 将一条线分成两个不同的对象