【问题标题】:Object: Directory error: did not understand #name对象:目录错误:不理解#name
【发布时间】:2019-05-10 08:02:24
【问题描述】:

以下列出目录中文件的简单代码来自here

(Directory name: '.')  
allFilesMatching: '*.st' 
do: [ :f | (f name) displayNl ]

但是,它不起作用并给出以下错误:

$ gst mysrc.st
Object: Directory error: did not understand #name:
MessageNotUnderstood(Exception)>>signal (ExcHandling.st:254)
Directory class(Object)>>doesNotUnderstand: #name: (SysExcept.st:1448)
UndefinedObject>>executeStatements (firstline.st:1)

我正在 Debian Stable Linux 上开发 GNU Smalltalk 3.2.5 版。

问题出在哪里,如何解决?

【问题讨论】:

    标签: directory smalltalk gnu-smalltalk


    【解决方案1】:

    我不知道是谁在 rosettacode 上写的,但 #name: 选择器不正确(Directory 类中不存在)。如果您检查Directory class,您将不会在那里找到这样的选择器。相反,您会找到一个#working: 选择器。选择器有一个描述:

    working: dirName
        Change the current working directory to dirName.
    

    您的代码将如下所示:

    (Directory working: '.') allFilesMatching: '*.st' do: [ :f | 
       (f name) displayNl
    ]
    

    【讨论】:

    • 为什么我们需要(f name) displayNl?我看到f displayNl 也有效。
    • 您需要仔细查看 stdout 以发现差异。 f displayNl 可以工作,但会返回不同的输出。将消息#name 发送到f 会为您提供文件的完整name(以及在这种情况下的路径)(这是字符串的一个实例)。仅发送 displayNl 将为您提供 File 的实例(您将看到双引号)。您可以尝试在 [ :f | f isFile printNl ][ :f | f name isString printNl ] 块中执行此操作。
    • @rnso 这些是不同的问题。我将逐步解决它们: 1. 是消息 #allFilesMatching:do: (#allFilesMatching: aStringMask do: aBlock) 整个是一条消息,因此您不能有 #allFilesMatching: 这将是不同的消息。您将消息发送到Directory working: '.' 的结果,而不是将此消息发送到Directory2ff name 使用它们只是为了便于阅读。它使阅读代码的任何人都可以更轻松地看到已完成的操作,然后打印结果。
    • Tukan,您在此答案中指出的文档似乎表明DirectoryFile 的子类。如果这是正确的,那么Directory 应该理解#name:,因为它是在File(类侧)中实现的。
    • 还要注意#working:的语义与#name:的语义不同。前者将更改当前工作目录,而后者将只创建所需文件夹的实例。这就是为什么 #name: 在这种情况下会更好。
    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 2017-07-31
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多