Hos*_*ork 3 rebol object 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!)
Run Code Online (Sandbox Code Playgroud)
声称它适用于对象或块.如果我用一个对象尝试它可以正常工作:
>> in object [foo: 10 bar: 20] 'foo
== foo
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是尝试使用原始块,它会返回NONE:
>> in [foo: 10 bar: 20] 'foo
== none
Run Code Online (Sandbox Code Playgroud)
猜猜我明白它是否不支持块(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]
Run Code Online (Sandbox Code Playgroud)
而且,在提出这三个问题的进一步风险中,PAREN有什么意义!换言之?
该IN功能主要不是意味着用于搜索一个对象为一个字,它是用于返回是词语的一个字或块中的对象,或在雷博尔术语绑定到该对象.它是BIND函数的一种变体,它在不同的情况下比BIND更有用.
如果对象中没有该名称的单词,则返回none,足够明智.这使得它能够在条件表达式中用作单词检测功能,但这不是它的主要用途.
IN可以为其对象参数获取一个对象块,然后尝试依次将该单词绑定到每个对象,返回绑定到具有该单词的块中的第一个对象的单词.对于Rebol 3 GUI的旧设计来说,这是一种相对快速的方法来覆盖字查找,但事实证明这不是最好的方法,因此GUI现在不使用该设计.但是,IN 块字被保留为其他地方未来使用的潜在有用特征.
在您的示例中,该块中没有对象,因此IN无法将该单词绑定到.这就是为什么IN没有返回.
如果为字参数传递IN块,它会在返回块之前将块绑定到对象.这是为了允许代码do in obj [print a]
.它没有做bind/copy
,所以你应该小心这样的代码.或者也许IN 对象块应该复制 - 改变它是否为时已晚?传递word参数的paren应该具有与传递块相同的绑定行为.
当我最后检查时,我们不支持将对象和单词参数都设置为块.这是因为我们无法找到一个好的模型来表明这种行为应该是什么,至少显然是这样.最重要的单词查找并不适用于一个单词块,因为结果将是不确定的.
有一个函数可以将一个块按顺序重新绑定到一系列对象,特别是对于重新创建Rebol的非真正嵌套的作用域,但这个函数真的很混乱.