在这短短的一章中,我们将向您展示一些在Pharo中查找信息的方法。
4.1 使用系统浏览器导航
有一些方法可以快速抵达您在Pharo中寻找的类或方法--确实非常快。稍后,我们将向您介绍Spotter,这是在Pharo找到对象的最快方法之一。但是现在,我们还在学习阶段,让我们试着走一条缓慢的路,只使用系统浏览器来查找Object
类中定义的printString
方法。在浏览结束时,我们将看到如图3-8所示的情况:
图3-8 系统浏览器显示`Object`类的`printString`方法
打开浏览器:使用World菜单或快捷方式Cmd-O Cmd-B。第一次打开新的系统浏览器窗口时,除最左侧外的所有窗格都是空的。第一个窗格列出了所有已知的包,其中包含相关类的组。
过滤包:在最左侧的筛选器中输入包名的一部分。它会过滤其上方的列表中显示的包的列表。例如,输入‘kern’。
展开
kernel
包并选择Objects
元素:当我们选中一个包时,它会使第二个窗格显示所选包中所有类的列表。您应该会看到ProtoObject
的类层次结构。选中
Object
类:当选择一个类时,将填充剩下的两个窗格。第三个窗格显示当前选定的类的协议。协议是出于方便对相关的方法进行的分组,我们将在本书的后面进一步讨论。如果未选择任何协议,则在第四个窗格中应该看到所有的方法。选择
printing
协议:您可能需要向下滚动才能找到它.Object
是一个相当重要的类,具有许多协议。您也可以单击第三个面板并键入pr
,以提前查找printing
协议。现在选择它,在第四个窗格中,您将只会看到与打印相关的方法。选择
printString
方法:现在我们在底部窗格中看到了printString
方法的源代码,由系统中的所有对象共享(覆盖掉它的对象除外)。
有更好的方法来找到方法,例如,只需在Playground中输入它,然后选择单词,并在代码搜索上下文菜单项中使用Implementors of it,您可以通过单击操作来调出该方法,或者只需使用键盘快捷键Cmd-M。
4.2 查找类
有几种方法可以在Pharo中找到一个类。正如我们在上面所看到的,第一个是知道(或猜测)它在哪个包中,并使用浏览器导航到它。
第二种方法是将消息browse
发送给实例或类本身,要求它在其自身上打开浏览器。假设我们要浏览Point
类:
使用
browse
消息:在Playground中输入Point browse
,然后Do it。将在Point
类上打开一个浏览器。您可以对10@20
(这是Point
类的一个实例)执行相同的操作。使用Cmd-B: 还有一个键盘快捷键Cmd-B,可以在任何文本窗格中使用;选择该单词,然后按Cmd-B。使用此键盘快捷键就可以浏览
Point
类。
请注意,当选择了Point
类但没有选择协议或方法时,我们看到的是类的定义,而不是方法的源代码。这只不过是一条发送给父类的普通消息,要求父类创建一个子类。如果您点击Class面板底部的注释按钮,您可以在专门的面板中看到类注释。
此外,系统还支持以下鼠标快捷方式:
Cmd-点击一个单词(在Windows和Linux上按住Alt键并单击鼠标右键):当该单词是一个类名时,打开类的定义。当您单击方法体中的选择器时,您还可以获得消息的实现者。
Shift-Cmd-点击一个单词(在Windows和Linux上按住Shift-Alt键并单击鼠标右键),当单词是类名时,打开一个列表浏览器,其中包含类的所有引用。当您单击方法体中的选择器时,您还可以获得消息的发送者。
使用Spotter
查找一个类最快的方法(也可能是最酷的方法)是使用Spotter。按Shift-Enter组合键打开Spotter,这是一个非常强大的工具,用于查找类、方法和许多其他相关操作。图4-1显示了Spotter用于查找Point
。
如图4-1所示, Spotter提供了几种可能性。您可以向Spotter指定您感兴趣的类别。例如,输入#Classes
后面跟上所要匹配的关键字,表示您对类感兴趣。
图4-1 使用Spotter Shift-Enter浏览Point类
图4-2显示了如何让Spotter显示给定消息的所有实现者。我们不需要输入完整的类别名称。其他类别包括:
#Menu
, 匹配World菜单中的条目#Packages
, 匹配系统里的包#Implementors
, 匹配方法的实现者#Senders
, 匹配消息的发送者#Help
, 匹配Pharo帮助系统中的文档
图4-2 查找与printString匹配的实现
您可以只输入类别的开头来标识它,例如#sen printOn:
将给出消息printOn:
的所有发送者。
默认情况下,Spotter显示来自多个类别的匹配项,所有匹配项都分组在各自的类别标题下。您可以浏览每个类别以查看更多结果。
使用系统浏览器中的"Find class"
在系统浏览器中,还可以根据类的名字进行搜索。例如,假设您正在寻找一些表示日期和时间的未知类。
在系统浏览器中,在程序包窗格或类窗格中的任意位置单击,然后通过键入Cmd-F或从关联菜单中选择鼠标右键来启动类搜索窗口。在该对话框中键入time
。将显示类别列表,其名称中包含子字符串time
。选择一个(例如,Time
),然后单击确定(或按Enter),浏览器将显示它。
4.3 查找方法
有时,您可以猜测方法的名字,或者至少是方法名的一部分,这比猜测类的名字要更容易。例如,如果您对当前时间感兴趣,您可能希望有一个名为now
的方法,或者至少有一个包含“now”作为子字符串的方法。但是它可能在哪里呢?Spotter和Finder可以帮助您!
通过Spotter
正如我们已经说过的,Spotter也可以找到方法。您可以使用#Implementors
类别搜索方法--只需输入#Implementors aMethodName
即可。它将显示所有已实现并具有相似或相同名称的方法。例如,如果您输入#imp now
,您将看到所有以“now”开头的方法。
通过Finder
通过菜单栏上的Browse菜单或世界菜单打开Finder。在左上角的搜索框中输入now
,点击Search(或者按Enter键)。您应该看到类似于图4-3所示的结果列表。
图4-3 Finder工具
Finder将显示名字中包含子字符串“now”的所有方法的列表。要滚动到now
本身,请将光标移动到列表并键入“n”;这种提前输入的技巧在所有滚动窗口中都有效。展开“now”项将向您显示实现具有此名称的方法的类。选择其中的任何一个都将在底部的代码窗格中显示实现的源代码。也可以通过在左上角的搜索栏中键入“now”
来搜索完全匹配的内容;使用引号后只会获得完全匹配的内容。
4.4 通过示例查找方法
使用Finder,您可以根据上面提到的类或方法的名称来查找它们。您还可以在整个方法体中查找字符串,包括注释。
但Finder也提供了一种独特而强大的设施。有时,您可能对某个方法的存在有所了解,但不知道它叫做什么;您知道它预期的行为,但您不知道它叫什么。Finder仍然可以提供帮助!假设您想找到一个将字符串从小写转变为大写的方法(例如,将‘eureka’转换为‘EUREKA’)。我们可以给Finder一个方法的输入和预期的输出,它会(试着)为你找到它。
在Finder中,使用第二个下拉框(默认情况下显示Selectors)选择Examples模式。
在搜索框中输入'eureka' . 'EUREKA'
,按下Enter键或者单击Search按钮(不要忘了单引号)。
然后,Finder将建议一个执行您所寻找的方法的方法,并显示实现同名方法的类的列表。在本例中,它确定asUppercase
方法是执行符合您的示例的操作的方法,如图4-4所示。
图4-4 寻找给定字符串'eureka'返回字符串'EUREKA'的方法
点击'eureka' asUppercase -> 'EUREKA'
行,以显示实现了asUppercase
方法的类的列表。
类列表中一行开头的星号表示该方法实际上是用于获得所需结果的方法。因此,字符串前面的星号告诉我们String
类中定义的方法asUppercase
已经执行并返回了我们想要的结果。没有星号的类只是asUppercase
的其他实现者,它们共享方法名,但是不返回您想要的结果。因此,在我们的示例中没有执行在Character
类中定义的asUppercase
方法,因为‘eureka’不是一个字符实例(它是一个字符串)。
您还可以使用Finder搜索具有一个或多个参数的方法。例如,如果您正在寻找一种能够找到两个整数的最大公因数的方法,则可以尝试25 . 35 . 5
.您还可以给Finder提供多个示例来缩小搜索空间;底部窗格中的帮助文本解释了如何缩小搜索空间。
4.5 结论
Spotter 是导航系统和查找信息的强大工具。
Finder 允许您查找类、方法和更多的东西。此外,它还允许您根据接收消息的对象、消息参数和返回的对象查找方法。