如何通过添加函数来扩展对象,然后使用 self 访问原始对象?

How to extend object by adding a function, and then access original object using self?

我正在定义一个包含两个字段的简单对象。后来我想用一个可以读取这些字段的函数来扩展它。 (目前,假设它只想打印其中一个。)

email-service!: context [ 
    key: "abcd" 
    secret: "" 
] 

extend email-service! 'get-folders does [print self/key]

my_email: make email-service! [
    key: "asdfasdf" 
    secret: "who knows?" 
] 

my_email/get-folders 

预期的输出是 "asdfasdf",但是什么也没有打印出来。

稍微改变一下,将 "does" 替换为函数:

extend email-service! 'get-folders func [] [print self/key]

鉴于 "definitional scoping" 的工作原理...您定义为 does [print self/key] 的例程确实绑定到封闭的上下文中。该上下文可能是一个模块或我们在这里看不到的某些上下文。

但是让我们引入一个手动上下文来说明我的意思:

context [
    key: "OUTER CONTEXT KEY"

    email-service!: context [ 
       key: "abcd" 
       secret: "" 
    ] 

    extend email-service! 'get-folders does [print self/key]

    my_email: make email-service! [
        key: "asdfasdf" 
        secret: "who knows?" 
    ] 

    my_email/get-folders 
]

这会给你 "OUTER CONTEXT KEY" 作为输出。您定义的这个函数只知道它的封闭上下文,它不知道您稍后将通过参数传递它以成为 email-service!.

的新成员

但显然您的问题不是关于如何将函数放入 email-service! 的定义中。你想在事后添加它。如何连接它以了解电子邮件服务? 通过在您需要的位置显式绑定函数体。

email-service!: context [ 
    key: "abcd" 
    secret: "" 
] 

extend email-service! 'get-folders does bind [print key] email-service!

my_email: make email-service! [
    key: "asdfasdf" 
    secret: "who knows?" 
] 

my_email/get-folders 

这应该能让您得到想要的 "asdfasdf"。如果你想用一个函数来做,你会做同样的......绑定主体:

extend email-service! 'get-folders func [] bind [print key] email-service!

email-service是否绑定self词由你决定!并使用它。你在这里不需要它 (注意我说的是 print key 而不是 print self/key。请记住,您处理的每个单词都可以具有评估绑定......即使对于由多个上下文组成的代码中具有相同拼写的单词,它也可能不同。