String 为什么文件路径字符串没有拆分

String 为什么文件路径字符串没有拆分,string,split,smalltalk,gnu-smalltalk,String,Split,Smalltalk,Gnu Smalltalk,我想在目录中查找文件,然后拆分路径名,并在单独的行上打印路径的每一部分: (Directory working: '.') allFilesMatching: '*.st' do: [ :ff | (ff name) findTokens: '/' "Linux separator" "splitOn: '/' -this also does not work" do: [ :i| i displayNl ]] 但是,它给出了

我想在目录中查找文件,然后拆分路径名,并在单独的行上打印路径的每一部分:

(Directory working: '.')
allFilesMatching: '*.st' do: [ :ff | (ff name)
    findTokens: '/'     "Linux separator"
    "splitOn: '/'        -this also does not work"   
    do: [ :i|
        i displayNl ]]
但是,它给出了以下错误:

$ gst firstline.st 
"Global garbage collection... done"
Object: '/home/abcd/firstline.st' error: did not understand #findTokens:do:
MessageNotUnderstood(Exception)>>signal (ExcHandling.st:254)
String(Object)>>doesNotUnderstand: #findTokens:do: (SysExcept.st:1448)
optimized [] in UndefinedObject>>executeStatements (firstline.st:3)
[] in Kernel.RecursiveFileWrapper(FilePath)>>filesMatching:do: (FilePath.st:903)
[] in Kernel.RecursiveFileWrapper>>namesDo:prefixLength: (VFS.st:378)
[] in File>>namesDo: (File.st:589)
BlockClosure>>ensure: (BlkClosure.st:268)
File>>namesDo: (File.st:586)
Kernel.RecursiveFileWrapper>>namesDo:prefixLength: (VFS.st:373)
Kernel.RecursiveFileWrapper>>namesDo: (VFS.st:396)
Kernel.RecursiveFileWrapper(FilePath)>>filesMatching:do: (FilePath.st:902)
File(FilePath)>>allFilesMatching:do: (FilePath.st:775)
Directory class>>allFilesMatching:do: (Directory.st:225)
UndefinedObject>>executeStatements (firstline.st:2)
错误消息非常长而且复杂

findtoken
splitOn
都不工作


问题在哪里,如何解决。

消息可能很长,但行中说明了原因:

对象:'/home/abcd/firstline.st'错误:不理解#findTokens:do

您可能希望以不同的方式使用拆分,可能需要使用
子字符串:$character
。我刚刚在GNU Smalltalk windows版本上试用过:

命令:

'C:\prg\u sdk\GNU Smalltalk(x86)\share\Smalltalk\unsupported\torry.st'子字符串:$\

结果是:

OrderedCollection ('C:' 'prg_sdk' 'GNU Smalltalk(x86)' 'share' 'smalltalk' 'unsupported' 'torture.st' )
当您在集合中拥有路径时,可以从中获取路径。你要么从头开始,要么结束

例如,您可以这样从头开始:

resultPath := nil.
pathCollection := 'C:\prg_sdk\GNU Smalltalk(x86)\share\smalltalk\unsupported\torture.st' subStrings: $\.
pathCollection do: [ :eachPartPath |
     resultPath := (resultPath isNil) ifTrue: [
        eachPartPath
    ] ifFalse: [
        resultPath, '\', eachPartPath
    ].
    resultPath displayNl
]

但是为什么
findtoken
splitOn
不起作用呢?我缩短了文件路径名以降低复杂性。
#findtoken:
#splitOn:
可能用于不同的Smalltalk实现,如Pharo,但不用于GNU Smalltalk。