如何通过添加函数来扩展对象,然后使用 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
)。请记住,您处理的每个单词都可以具有评估绑定......即使对于由多个上下文组成的代码中具有相同拼写的单词,它也可能不同。
我正在定义一个包含两个字段的简单对象。后来我想用一个可以读取这些字段的函数来扩展它。 (目前,假设它只想打印其中一个。)
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
)。请记住,您处理的每个单词都可以具有评估绑定......即使对于由多个上下文组成的代码中具有相同拼写的单词,它也可能不同。