【问题标题】:How to extend object with multiple functions in one call?如何在一次调用中扩展具有多个功能的对象?
【发布时间】:2014-08-14 17:23:42
【问题描述】:

在 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

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

【问题讨论】:

    标签: object rebol rebol3


    【解决方案1】:

    由于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"]]
    ]
    

    【讨论】:

    • 啊,很明显!它试图完成任务。 :-/ 我应该多加注意。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多