我正在尝试创建一个具有字符串修整函数的类:
Object subclass: Trimmer [
trimleading: str [ |ch ret|
ch := (str first: 1). "get first character"
ret := str. "make a copy of sent string"
[ch = ' '] whileTrue: [ "while first char is space"
ret := (ret copyFrom: 2). "copy from 2nd char"
ch := ret first: 1. "again test first char"
].
^ret "return value is modified string"
].
trim: str [ |ret|
ret := str.
ret := (trimleading value: ret). "trim leading spaces"
ret := (trimleading value: (ret reverse)). "reverse string and repeat trim leading"
^(ret reverse) "return reverse string"
]
].
oristr := ' this is a test '
('ORI..>>',oristr,'<<') displayNl.
('FINAL>>',((Trimmer new) trim: oristr),'<<') displayNl.但是,它没有运行并给出以下错误:
$ gst trimstring_class.st
trimstring_class.st:10: invalid class body element
trimstring_class.st:17: expected expression问题在哪里,如何解决?
如果在剪切引导方法块之后删除.,如下面的代码所示:
Object subclass: Trimmer [
trimleading: str [ |ch ret flag|
ret := str. "make a copy of sent string"
flag := true.
[flag] whileTrue: [ "while first char is space"
ch := ret first: 1. "again test first char"
ch = ' '
ifTrue: [ ret := (ret copyFrom: 2 to: ret size)] "copy from 2nd char"
ifFalse: [flag := false]
].
^ret "value is modified string"
] "<<<<<<< PERIOD/DOT REMOVED FROM HERE."
trim: str [ |ret|
ret := str.
ret := (trimleading value: ret). "trim leading spaces"
ret := (trimleading value: (ret reverse)). "reverse string and repeat trim leading"
^(ret reverse) "return reverse string"
]
].然后,代码开始运行,但终止时出现以下错误:
$ gst trimstring_class.st
trimstring_class.st:15: undefined variable trimleading referenced
ORI..>> this is a test <<
Object: Trimmer new "<0x7f1c787b4750>" error: did not understand #trim:
MessageNotUnderstood(Exception)>>signal (ExcHandling.st:254)
Trimmer(Object)>>doesNotUnderstand: #trim: (SysExcept.st:1448)
UndefinedObject>>executeStatements (trimstring_class.st:23)为什么trimleading方法现在未定义,以及为什么gnu-smalltalk did not understand #trim:
发布于 2019-05-14 07:28:21
通常,这样的通用用例检查这种功能是否已经实现是明智的。您可以从它中获得代码的灵感(作为Smalltalk程序员,您也会得到改进)。看一看trimBlanksFrom:来自sports.st
SpStringUtilities class >> trimBlanksFrom: aString [
"^a String
I return a copy of aString with all leading and trailing blanks removed."
<category: 'services'>
| first last |
first := 1.
last := aString size.
[last > 0 and: [(aString at: last) isSeparator]]
whileTrue: [last := last - 1].
^last == 0
ifTrue: [String new]
ifFalse: [
[first < last and: [(aString at: first) isSeparator]]
whileTrue: [first := first + 1].
aString copyFrom: first to: last
]
]如果你只想修剪前导空间,你可以只占第二部分,在第二部分,它正在修剪前导空间。
编辑应用的修补程序中的OP自己的代码:
Object subclass: Trimmer [
trimleading: str [ |ch ret flag|
ret := str. "make a copy of sent string"
flag := true.
[flag] whileTrue: [ "while first char is space"
ch := ret first: 1. "again test first char"
ch = ' '
ifTrue: [ ret := (ret copyFrom: 2 to: ret size) ] "copy from 2nd char"
ifFalse: [flag := false ]
].
^ret "value is modified string"
] "<<<<<<< PERIOD/DOT REMOVED FROM HERE."
trim: str [ |ret|
ret := str.
ret := self trimleading: (ret copy). "trim leading spaces"
ret := self trimleading: (ret copy reverse). "reverse string and repeat trim leading"
^ (ret reverse) "return reverse string"
]
].
oristr := ' this is a test '
('ORI..>>',oristr,'<<') displayNl.
('FINAL>>',((Trimmer new) trim: oristr),'<<') displayNl.这些都是需要修正的错误。如果要寻址选择器#trimleading:,则必须使用self关键字搜索本地类(查找自己的类或继承的类)。接下来,您不应该更改要分配给您的变量,应该使用#copy,否则可能会出现奇怪的结果。
https://stackoverflow.com/questions/56122656
复制相似问题