我在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
我有办法让这个工作吗?
我想要做的总结是有一个处理程序列表,我可以通过索引而不是名字来调用。
答案 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