如何访问与类同名但具有不同事件代码的属性?

时间:2012-01-29 01:54:16

标签: applescript

当应用程序对类和属性使用相同的名称但使用不同的事件代码时,我尝试在对象说明符中使用该属性,AppleScript将标识符解释为类而不是属性。例如:

tell application "Mail"
    header of first rule condition of first rule
end

这会导致错误:

  

邮件收到错误:无法获取规则1的规则条件1的标题。

AppleScript编辑器中的header样式(蓝色斜体)表明它是类名而不是属性。如何指定标识符是属性并明确解决此命名冲突?

我正在运行OS X 10.6.8和Mail.app 4.5。

非工作解决方案

在“Applescript: The Definitive Guide”中,Matt Neuberg建议可以使用its

  

当应用程序定义了与类同名的属性时,需要关键字it。 [...]说its消除歧义。

但是,这不能解决上面示例代码中的问题。添加its后,header仍然被设置为类,脚本会导致相同的错误。

tell application "Mail"
    its header of first rule condition of first rule
end

应用第20.8.3节中的示例。 “具有同名类的属性”具有相同的结果。

tell application "Mail"
    tell first rule
        tell first rule condition
            get its header
        end tell
    end tell
end tell

背景

我正在尝试编写AppleScript来扩展Mail.app的规则条件以支持模式匹配。其中一个扩展规则中的某些规则条件是包含脚本的信息,例如要匹配的模式以及模式匹配时要采取的操作,而不是Mail应匹配的条件。我想对这些规则条件使用header属性。

扩展规则以允许模式匹配的替代方法很好但不要求。我仍然喜欢回答的具体问题,因为除了这种特殊用法之外的情况会出现问题。

2 个答案:

答案 0 :(得分:3)

编辑:通过做一些重新排列,我能够让它失败。脚本编辑器似乎确实锁定了它的第一个猜测,因此一种解决方案是使用运行脚本在运行时使用原始类,例如:

tell application "Mail"
    header of (get properties of first rule condition of first rule) -- fails
end tell

set myHeader to (run script "tell application \"Mail\"
    return «class rhed» of (get properties of first rule condition of first rule)
end tell")
myHeader --> success

答案 1 :(得分:0)

根据对"Applescript et Mail.app, bug ou c'est moi"的评论,header属性的事件代码与类不同(属性为“rhed”,类为“mhdr”)。这似乎是错误的实际原因(header编译为«class mhdr»)并提供了一个潜在的解决方案:您可以使用原始事件代码指示符来获取此特定情况下的属性。

tell application "Mail"
    «property rhed» of first rule condition of first rule
end

但是,第一次保存脚本时,原始代码会被名称替换,第二次保存名称会被重新解释为类而不是属性,要求您更正每次出现的每次保存时的属性名称。通过定义一个处理程序来获取要使用Mail.app的术语的块之外的属性,可以减少要完成的工作量。

on hdr(rc)
    return «property rhed» of rc
end hdr
tell application "Mail"
    my hdr(first rule condition of first rule)
end

通过在未使用Mail.app条款的位置定义处理程序,原始代码不会被标识符替换。

这只能部分解决存储编辑问题,因为每个单独的属性都需要自己的处理程序,而且(更糟糕的是)处理程序似乎不能在filter forms中工作(尽管可以使用循环)。因此,我不能接受这个答案,如果有人能找到答案,我将不胜感激。例如,以下

on hdr(rc)
    return «property rhed» of rc
end hdr
tell application "Mail"
    every rule condition of first rule where my hdr(it) is not ""
end

结果:

  

错误“邮件收到错误:无法获取标题。”编号为-1728,来自标题