Object 如何在中使用块而不是对象?

Object 如何在中使用块而不是对象?,object,rebol,rebol3,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!)

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
声明称,它适用于对象或块。如果我尝试使用一个对象,它可以正常工作:

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
但如果我只是用一块未加工的块试一下,它不会返回任何结果:

>> in [foo: 10 bar: 20] 'foo
== none
如果它不支持块(Rebol2不支持),我想我会理解的。但在什么情况下,它不会返回任何允许的块

冒着把这两个问题合二为一的风险,接受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有什么意义呢!对于word have?

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

如果对象中没有该名称的单词,它将返回none,这是非常明智的。这使它能够在条件表达式中用作单词检测函数,但这不是它的主要用途

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

在您的示例中,该块中没有对象,因此中没有可以将单词绑定到的对象。这就是为什么没有人返回

如果为word参数传入一个块,它会在返回该块之前将该块绑定到对象。这是为了在obj[打印a]中允许类似于
do的代码。不过,它不会进行
绑定/复制
,所以您应该小心处理这样的代码。或者也许在对象块中应该复制-现在改变它是否太晚了?传递单词参数的paren应该具有与传递块相同的绑定行为

上次我检查时,我们不支持将对象和单词参数都设置为块。这是因为我们无法找到一个好的行为模型,至少很明显。覆盖词查找实际上无法处理一块词,因为结果将是不确定的


让一个函数按顺序将一个块反弹到一系列对象中是很有用的,特别是对于重新创建Rebol不是真正嵌套的作用域,但是如果该函数位于其中,则会非常混乱。

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

red>> first find [foo: 10 bar: 20] 'foo
== foo:
这对rebol2 tho不起作用,但是
quote
ing
set单词是否:

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

仍然有返回
set单词的轻微缺点

长话短说:FIND是多态的,返回逻辑!“是对象中的键”,而“是”与绑定伏都教有关…而不是因为名称而使您认为它的功能。我想我在这里担心的是,由于FIND对于block和object来说是如此的不同,所以如果“haskey”是一个单独的东西来防止事故的话,那就更安全了。也许HAS可以重新用于返回布尔结果的东西(对于生成函数的东西来说,这不是一个很好的词,IMO)…并且总是找到返回序列的位置?即使有多态性能力,一个人也应该有不变量。我不会卷入一场关于应该是什么的火焰之战,所以让我们先关注一下是什么。FIND是多态的,因为它是一个操作,并且Rebol中只有操作或操作的包装器是多态的。不在内部调用动作的本地人不是多态的。IN是一个介词,因此该函数用于英语中使用它的情况,例如
get IN obj'a
set IN obj'a 200
do IN obj[something]
。它存在的主要原因是代码清晰,否则我们可以使用BIND。单独在中使用没有意义。这是rebol3中的新行为吗?我似乎无法在rebol2或red中使用块:
**脚本错误:在类型为:object port**Near:in[foo:10 bar:20]'foo
@GeekyI的预期对象参数中,它似乎不在rebol2中。但是红色0.6.1似乎接受块作为参数……尽管它的结果似乎是错误的<代码>对象:生成对象![a:10 b:20 c:30]
然后在obj[a c]
中返回对象而不是回弹块。你可能会在他们的追踪器上提出一个问题来澄清意图。我刚刚意识到这是1中的3个问题,因此混淆:-p,我是指第1个问题(所以呃..我还不能@提及任何人..?)(@GeekyI对OP的提及如果是唯一与您交谈的人,则会被忽略,因为OP总是在他们的问题出现评论时得到通知。)=>我没有仔细阅读您的错误。您不能在任何解释器中说IN BLOCK!WORD!块不是查找单词的上下文。您可以在Rebol3中说IN OBJECT!BLOCK!是的,这是一个新功能。是的,find是检查块中是否有内容的正确操作。问题(及其答案)最终与IN是什么的问题有关。在提出这个问题几年后,我理解它的目的是反转BIND的参数顺序……而不是FIND的一种形式。@HostileFork问题是,
中的
可能是一个新手错误,因为
具有key
。实际上,作为一个更通用的包含,如
中的
蟒蛇之王,我了解孔子