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 不支持)。但在什么情况下它wouldn't返回 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 意味着什么!对于单词有?
IN 函数主要不是用于在对象中搜索单词,而是返回一个单词或单词块in对象,或者用 Rebol 术语来说bound to物体。它是 BIND 函数的一个变体,在与 BIND 不同的情况下很有用。
如果对象中不存在该名称的单词,则它不会返回任何内容,这是明智的。这给它带来了能够在条件表达式中用作单词检测功能的附带好处,但这不是它的主要用途。
IN 可以采用一个对象块作为其对象参数,然后尝试依次将单词绑定到每个对象,返回绑定到块中具有该单词的第一个对象的单词。这是一种相对快速的方法来对 Rebol 3 GUI 的旧设计进行覆盖单词查找,但事实证明在这种情况下它不是最好的方法,因此 GUI 现在不使用该设计。然而,在块词被保留为一个潜在有用的功能,以供将来在其他地方使用。
在您的示例中,该块中没有对象,因此 IN 无法将单词绑定到任何对象。这就是为什么 IN 没有返回任何内容。
如果您为单词参数传入一个块,它会在返回该对象之前将该块绑定到该对象。这是为了允许像这样的代码do in obj [print a]
。它不做一个bind/copy
不过,所以你应该小心这样的代码。或者也许在对象块应该复制 - 现在改变它是否太晚了?为单词参数传递括号应该与传递块具有相同的绑定行为。
当我上次检查时,我们不支持将对象和单词参数都作为块。这是因为我们无法找出一个好的模型来说明该行为应该是什么,至少显然是这样。覆盖单词查找实际上不适用于单词块,因为结果是不确定的。
如果有一个函数可以按顺序将一个块重新绑定到一系列对象,特别是对于重新创建 Rebol 的非真正嵌套作用域,那么该函数会非常有用,但如果该函数处于 IN 状态,则会非常令人困惑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)