3

roku/brightscript 开发的新手:是否可以将对象添加到全局关联数组(所有组件均可访问),该对象具有定义为属性之一的方法,并调用该方法?

主要.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 中,在运行任务并返回数据之后......

主控制器.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 行时,我得到了这个:

在 BrightScript 组件或接口中找不到成员函数。(运行时错误 &hf4) 在 pkg:/components/MainController.brs(16)

这只是对可以/不能做什么的一般测试,因此请不要评论这是否是“良好做法”。我只想知道这是否可能,如果可能,我在这里错过了什么?谢谢你的帮助

4

3 回答 3

6

可以将函数作为roAssociativeArray值。事实上,这就是在 BrightScript 中实现 OO 方法的方式。

但是,您不能将函数分配给 Roku 场景图对象(roSgNode派生类)的字段!直接或间接(嵌套)。这是(当前?!)实现的限制。

您可以在此处查看 RSG 支持的字段类型列表https://sdkdocs.roku.com/pages/viewpage.action?pageId=1608549

是的,它确实说支持assocarray和(最近)array- 但有一个警告!当您在线程之间分配(甚至访问)复合对象时,会进行深层复制,并且只有“支持的”类型才能通过 - 正如您所经历的那样,function它不是其中之一。所有无法识别的数据目前都被默默地丢弃,甚至没有警告 - 所以买家要小心。

有关更多信息,请参阅https://forums.roku.com/viewtopic.php?f=34&t=96955&p=541965#p541965。感觉被邀请在 Roku 的开发者论坛中添加您的声音,请求 RSG 对功能类型的支持——如果有足够多的人抱怨,他们往往会倾听。

于 2016-12-21T21:25:44.477 回答
1

您不能在节点的字段中传递函数。只有数据。如果m.global.mainMethods.getName设置后立即检查值,它将无效。

于 2016-12-21T10:40:13.433 回答
0

我认为您可以使用匿名函数来做到这一点。

https://developer.roku.com/en-gb/docs/references/brightscript/language/program-statements.md#anonymous-functions

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)
于 2019-08-21T00:25:27.713 回答