Object 如何在一次调用中扩展具有多个函数的对象?

Object 如何在一次调用中扩展具有多个函数的对象?,object,rebol,rebol3,Object,Rebol,Rebol3,在Rebol 3中,您可以使用append动态地向对象添加键和值: >> foo: object [x: 10] >> append foo [y: 20 z: 30] == make object! [ x: 10 y: 20 z: 30 ] 但如果您尝试使用函数,它似乎不起作用: >> foo: object [x: 10] >> append foo reduce [y: does [print "y"] z:

在Rebol 3中,您可以使用append动态地向对象添加键和值:

>> foo: object [x: 10]

>> append foo [y: 20 z: 30]
== make object! [
    x: 10
    y: 20
    z: 30
]
但如果您尝试使用函数,它似乎不起作用:

>> foo: object [x: 10]

>> append foo reduce [y: does [print "y"] z: does [print "z"]]
** Script error: invalid argument: make function! [[][print "y"]]
** Where: append
** Near: append foo reduce [y: does [print "y"] z: does [print "z"]]
您可以使用extend添加函数:

>> foo: object [x: 10]

>> extend foo 'y does [print "y"]

>> foo/y
y

但这只允许您一次添加一个。如何将任意键/值块添加到对象中,并使用其中一些函数?

因为extend只是一个夹层

>> source extend
extend: make function! [[
   {Extend an object, map, or block type with word and value pair.}
   obj [object! map! block! paren!] "object to extend (modified)"
   word [any-word!]
   val
][
  if :val [append obj reduce [to-set-word word :val]]
  :val
]]
您可以轻松地定义自己的扩展或新函数

extends: make function! [  [{Extend an object}
   obj  [object!]
   funcblk [block!]  "with pair(s) of functionname and function"
] [
   foreach [name funcon] funcblk [append obj reduce [to-set-word name get funcon]]
]]
然后你就能做到

>> r: does [print "y"] s: does [print "z"]
>> extends foo [y r z s]
== make object! [
   x: 10
   y: make function! [[][print "y"]]
   z: make function! [[][print "z"]]
]
或者简称

>> append foo reduce [quote y: does [print "y"] quote z: does [print "z"]]
== make object! [
    x: 10
    y: make function! [[][print "y"]]
    z: make function! [[][print "z"]]
]

啊,很明显!它正在尝试做作业。:-/我应该多加注意。谢谢