是否可以将匿名函数分配给全局关联数组属性?
Is it possible to assign an anonymous function to a global associative array property?
roku/brightscript 开发的新手:是否可以将一个对象添加到全局关联数组(所有组件都可以访问),该对象具有定义为属性之一的方法,并调用该方法?
Main.brs:
function Main()
init()
end function
function init()
screen = createObject("roSGScreen")
m.port = createObject("roMessagePort")
screen.SetMessagePort(m.port)
scene = screen.CreateScene("MainController")
screen.show()
o = {
getName: function() as string
return "John"
end function
}
setUpGlobal(screen)
m.global.addFields({mainMethods: o})
while(true)
msg = wait(0, m.port)
msgType = type(msg)
if msgType = "roSGScreenEvent"
if msg.isScreenClosed() then exit while
end if
end while
end function
function setUpGlobal(p_screen as Object)
m.global = p_screen.getGlobalNode()
m.global.id = "GlobalNode"
end function
.. 然后在另一个 MainController 中,在 运行 任务和返回数据之后...
MainController.brs
function init()
loadConfig()
end function
function loadConfig()
m.config = createObject("roSGNode", "Configurator")
m.config.observeField("done", "onConfigLoaded")
m.config.observeField("fail", "onConfigError")
end function
function onConfigLoaded()
print "config loaded: " + m.global.mainMethods.getName()
end function
function onConfigError()
print "config failed to loaded"
end function
当它到达 MainController 的第 16 行时,我得到这个:
Member function not found in BrightScript Component or interface.
(runtime error &hf4) in
pkg:/components/MainController.brs(16)
这只是对can/can不做的一般测试,所以请不要评论这是否是"good practice"。我只想知道是否可能,如果可能,我在这里错过了什么?感谢您的帮助
您不能在节点的字段中传递函数。只有数据。 m.global.mainMethods.getName
值设置后立即检查,则无效。
您可以具有roAssociativeArray
值的功能。事实上,这就是 OO 方法在 BrightScript 中的实现方式。
但是,您不能 将函数分配给 Roku 场景图对象(roSgNode
派生对象)的字段!直接或间接(嵌套)。这是(当前?!)实施的限制。
您可以在此处查看 RSG 支持的字段类型列表 https://sdkdocs.roku.com/pages/viewpage.action?pageId=1608549
是的,它确实表示支持 assocarray
和(最近)array
- 但有一个警告!当您在线程之间分配(甚至访问)复合对象时,会进行深度复制,并且只有 "supported" 类型才能通过 - 正如您所经历的那样,function
不是其中之一。目前,所有无法识别的数据都被悄无声息地丢弃,甚至没有发出警告——所以买家要当心。
有关更多信息,请参阅 https://forums.roku.com/viewtopic.php?f=34&t=96955&p=541965#p541965。受邀在 Roku 的开发者论坛中发表您的意见,请求 RSG 支持功能类型 - 如果有足够多的人抱怨,他们往往会倾听。
我想你可以用匿名函数来做到这一点。
q = {
starring : Function(o, e)
str = e.GetBody()
print "Starring: " + str
toks = box(str).tokenize(",")
For Each act In tok
actx = box(act).trim()
If actx <> "" Then
print "Actor: [" + actx + "]"
o.Actors.Push(actx)
End If
End For
Return 0
End Function
}
q.starring(myobj, myxml)
roku/brightscript 开发的新手:是否可以将一个对象添加到全局关联数组(所有组件都可以访问),该对象具有定义为属性之一的方法,并调用该方法?
Main.brs:
function Main()
init()
end function
function init()
screen = createObject("roSGScreen")
m.port = createObject("roMessagePort")
screen.SetMessagePort(m.port)
scene = screen.CreateScene("MainController")
screen.show()
o = {
getName: function() as string
return "John"
end function
}
setUpGlobal(screen)
m.global.addFields({mainMethods: o})
while(true)
msg = wait(0, m.port)
msgType = type(msg)
if msgType = "roSGScreenEvent"
if msg.isScreenClosed() then exit while
end if
end while
end function
function setUpGlobal(p_screen as Object)
m.global = p_screen.getGlobalNode()
m.global.id = "GlobalNode"
end function
.. 然后在另一个 MainController 中,在 运行 任务和返回数据之后...
MainController.brs
function init()
loadConfig()
end function
function loadConfig()
m.config = createObject("roSGNode", "Configurator")
m.config.observeField("done", "onConfigLoaded")
m.config.observeField("fail", "onConfigError")
end function
function onConfigLoaded()
print "config loaded: " + m.global.mainMethods.getName()
end function
function onConfigError()
print "config failed to loaded"
end function
当它到达 MainController 的第 16 行时,我得到这个:
Member function not found in BrightScript Component or interface. (runtime error &hf4) in pkg:/components/MainController.brs(16)
这只是对can/can不做的一般测试,所以请不要评论这是否是"good practice"。我只想知道是否可能,如果可能,我在这里错过了什么?感谢您的帮助
您不能在节点的字段中传递函数。只有数据。 m.global.mainMethods.getName
值设置后立即检查,则无效。
您可以具有roAssociativeArray
值的功能。事实上,这就是 OO 方法在 BrightScript 中的实现方式。
但是,您不能 将函数分配给 Roku 场景图对象(roSgNode
派生对象)的字段!直接或间接(嵌套)。这是(当前?!)实施的限制。
您可以在此处查看 RSG 支持的字段类型列表 https://sdkdocs.roku.com/pages/viewpage.action?pageId=1608549
是的,它确实表示支持 assocarray
和(最近)array
- 但有一个警告!当您在线程之间分配(甚至访问)复合对象时,会进行深度复制,并且只有 "supported" 类型才能通过 - 正如您所经历的那样,function
不是其中之一。目前,所有无法识别的数据都被悄无声息地丢弃,甚至没有发出警告——所以买家要当心。
有关更多信息,请参阅 https://forums.roku.com/viewtopic.php?f=34&t=96955&p=541965#p541965。受邀在 Roku 的开发者论坛中发表您的意见,请求 RSG 支持功能类型 - 如果有足够多的人抱怨,他们往往会倾听。
我想你可以用匿名函数来做到这一点。
q = {
starring : Function(o, e)
str = e.GetBody()
print "Starring: " + str
toks = box(str).tokenize(",")
For Each act In tok
actx = box(act).trim()
If actx <> "" Then
print "Actor: [" + actx + "]"
o.Actors.Push(actx)
End If
End For
Return 0
End Function
}
q.starring(myobj, myxml)