Applescript - 从列表中运行处理程序

时间:2015-09-02 02:33:03

标签: list applescript handler

我在AppleScript中试用了这段代码:

第一个起作用,第二个起作用

global theOpts
on saySomething()
--some code that it runs
end 

set theOpts to {saySomething}

--the one that does

set t to theOpts's item 1
t()

--the one that doesn't

on runByIdx(idx)
    set thefun to item 1 of theOpts
    thefun()
end runByIdx

我有办法让这个工作吗?

我想要做的总结是有一个处理程序列表,我可以通过索引而不是名字来调用。

2 个答案:

答案 0 :(得分:2)

不要那样做。这是一种无证的行为和已知的设计缺陷。处理程序不应被视为对象,它会破坏处理程序与封闭脚本的绑定。

正确的方法是将每个处理程序包装在自己的脚本对象中,然后将这些脚本对象放在列表中。

script Foo
    on doIt()
        say "this"
    end doIt
end script

script Bar
    on doIt()
        say "that"
    end doIt
end script

set opts to {Foo, Bar}

doIt() of item 1 of opts

虽然您也不应低估简单if...else if...块的价值:

if idx = 1 then
    doThis()
else idx = 2 then
    doThat()
else ...

基本上,这取决于你要解决的问题。但我倾向于采用后一种方法(即KISS),除非这是一项需要额外灵活性的任务,否则你只是增加了不必要的复杂性并为自己创造了工作。

(FWIW,我在几年前共同撰写的AppleScript book有一章关于使用脚本对象。关于库的部分不涉及10.9+中的新库系统,以及关于OOP的部分如果你知道在哪里看,你有一个技术错误的软木塞:p,但如果你真的想知道更多的话,它可能是你会发现这个主题的最佳解释。)

答案 1 :(得分:0)

这种方式都有效......

drawable