14 9月, 2016

脚本对象

内容纲要

AS是一个OO(object-oriented)语言。 面向对象的特性,让代码更加地简洁易读,本章将介绍除了事件处理器之外的另一个重要OO部分————脚本对象,相当于其他语言的“类”(Class)

me关键字

me关键字在AS中指代当前脚本。 两个常见用途:

  • path to me 返回当前脚本的路径,如果在编写脚本时运行,返回结果将是AS编辑器的路径;
  • class of me 返回“我”的类型,毫无疑问一般情况下就是script(脚本)

实践中,“path to me”非常有用,尤其在需要调用其他脚本文件时。

编写和使用基本的script对象

使用script对象的目的是将同样功能代码归类(专业术语为“封装”)。 你可以通过script和end script关键字来显式声明一个script。 示例如下:

代码一:

preperty dialogText : "ShowMe脚本中的代码"

script ShowMe
    display dialog dialogText

    on showSomething()                --在脚本对象内部建立一个事件处理器
        display dialog "这是脚本对象中的事件处理器"
    end showSomething
end script

如果你尝试运行它,会发现没有任何效果! 没错,脚本对象本身就像一个工人,它不会自说自话的去完成任何工作,除非老板明确指示他要做。但是通过脚本对象内部的代码,这个工人能够做些什么事情已经被确定了。 脚本对象就是建立了这样一个“工人”。
接下来我们的任务自然是学习如何“指示这个工人去工作”。要执行脚本对象中得代码,应当使用run命令:(请注意:以下代码,需要与上面代码(“代码一”)在同一文件中

run ShowMe

注意:正如普通的事件处理器,位于脚本对象中的事件处理器,在没有得到明确指令时,是不会执行其中代码的。 使用工人的例子来说就是,工人有各种能力,老板让他用这个能力,他一定不会去用。

接下来的代码是如何运行位于脚本对象中的事件处理器

showSomething() of ShowMe

这些代码将仅仅执行ShowMe对象中的showSomething()事件处理器内的代码。

这里推荐另一种调用脚本对象的方法,即tell语句,适用于调用任何类型的脚本对象内部代码,这个方法提高了程序易读性和整洁性

tell ShowMe
    run                 --执行脚本对象中的代码,但不包括事件处理器的代码
    showSomething()     --执行对应事件处理器内的代码,不执行其他代码
end tell

载入和调用外部script对象

要载入并运行来自其他脚本文件中的脚本对象,首先要求存在一个脚本文件,然后我们应该获得它的路径位置,其次载入它,最后运行它

下面示例要求我们先将上面的“代码一”保存到桌面,并命名为“Script to Load”,然后新建一个脚本文件,输入如下代码:

set thePath to ((path to desktop) as text) & "Script to Load.scpt"
--获得目标脚本对象的位置
set theScript to load script file thePath
--载入该脚本,记得一定要给它“取名”

run ShowMe of theScript
--运行脚本对象
showSomething() of ShowMe of theScript
--运行脚本对象中的事件处理器

你会发现用了好多个of,确实,为了让傻傻地AppleScript编译器知道我在跟谁说话,必须一次次明确告诉他我想和谁说话。 当然你会想到又一个简单明了的方法:那就是用tell语句模块

特别说明:其实载入外部脚本,并不要求该外部脚本拥有Script对象,任何脚本都是可以被加载的。开发者通常把一堆事件处理器放在一个文件中,这样就建立了一个“库”。

修改外部script对象中得属性变量

AS不仅允许载入外部script脚本,还允许修改外部script对象中的属性。

下面示例要求我们先将上面的“代码一”保存到桌面,并命名为“Script to Load”,然后新建一个脚本文件,输入如下代码:

set thePath to ((path to desktop) as text) & "Script to Load.scpt"
set theScript to load script file thePath

run ShowMe of theScript                 --初次运行

set dialogText of theScript to "哈哈,我修改了你!"
run ShowMe of theScript                 --修改之后再运行

两个同样地run ShowMe of theScript显示了不同的对话框,证明外部脚本中的属性可以被修改。 不过当你再次运行脚本时,发现第三行的run ShowMe结果仍然是本来外部脚本文件中所设定的。 没错,这里set dialogText命令只是传递给了内存中的外部脚本,并没有写入脚本文件。 所以这里的set仅仅是“一次性”的,它不会影响外部脚本本身。

当然,如果你确实真需要修改外部脚本中得属性,也是可以的,AS提供了store script命令。 在上面示例中添加一行新代码:

store script theScript in file thePath with replacing

那么第二次运行当前脚本时,第一个“showMe”仍然是“哈哈,我修改了你!”。 需要指出的时,with replacing属性告诉store script命令“别怕,放心地去替换”,如果省略,AS将会询问是否确认替换,with replacing本质上是一个危险地操作,因为你可以随意修改外部脚本

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注