Oop Pharo Smalltalk中用于展平列表的If语句(无返回)
我正试着列一个清单。 我有这个:Oop Pharo Smalltalk中用于展平列表的If语句(无返回),oop,if-statement,smalltalk,pharo,Oop,If Statement,Smalltalk,Pharo,我正试着列一个清单。 我有这个: #(#(a a a) nil nil #(b) #(c) #(d) nil nil nil #(e e) nil #(f f) nil #(g) #(h) nil nil nil #(i i) nil nil nil #(j) nil nil nil nil nil #(k) #(l l l) 我想做一个程序,把它变成这样一个列表: #(a a a b c d e e f f g hi i j k l l l) 我的代码是: ToList:
#(#(a a a) nil nil #(b) #(c) #(d) nil nil nil #(e e) nil #(f f) nil #(g)
#(h) nil nil nil #(i i) nil nil nil #(j) nil nil nil nil nil
#(k) #(l l l)
我想做一个程序,把它变成这样一个列表:
#(a a a b c d e e f f g hi i j k l l l)
我的代码是:
ToList: lista
| retorno y z |
retorno := Array new: 30.
y := 1.
(1 to: lista size)
do: [ :i |
z := 0.
(lista at: i) isNil
ifFalse:
(1 to: (lista at: i) size do: [ :j | retorno at: (y + z) put: ((lista at: i) at: j )
y:= y+1.
z:= z +1.]
)].
^retorno
我认为if语句存在一些问题,因为没有返回。我不知道该怎么办,因为它在没有y:=y+1.
的情况下工作,但它保留了一些零空格
请帮帮我 代码中有两个语法错误:
ifTrue:
、ifFalse:
等的参数是块,Smalltalk中的块是用方括号括起来的表达式,而不是括号。在你的情况下,你应该写信
(lista at: i) isNil
ifFalse:
[1 to: (lista at: i "<- [ not ("
i、 例如,一组符号
,你不想写这么多#
s。所以,在你的练习中,你应该考虑你是否真的想要字符($a$a)
、字符串('a''a''a')
或符号(#a#a)
其他字符串也是如此。例如,#(abc de)
将被编译为#(#abc de)
。。。嗯
但是等一下。如果是这样,为什么#(#(a)nil)
不被编译为#(#(a)nil)
?嗯,因为编译器对nil
、true
和false
进行了异常处理。。。uff
还请注意,在Smalltalk的某些方言中,编译器会将#((a a))
解释为#(#(a a))
,因此您不必键入那么多磅符号
总结。如果您选择在文字数组中节省一些英镑,请保持一致,编写
#((a a))
而不是#(#(a a))
。否则,请完全明确并编写#(#(#(#a#a#a))
代码中有两个语法错误:
ifTrue:
、ifFalse:
等的参数是块,Smalltalk中的块是用方括号括起来的表达式,而不是括号。在你的情况下,你应该写信
(lista at: i) isNil
ifFalse:
[1 to: (lista at: i "<- [ not ("
i、 例如,一组符号
,你不想写这么多#
s。所以,在你的练习中,你应该考虑你是否真的想要字符($a$a)
、字符串('a''a''a')
或符号(#a#a)
其他字符串也是如此。例如,#(abc de)
将被编译为#(#abc de)
。。。嗯
但是等一下。如果是这样,为什么#(#(a)nil)
不被编译为#(#(a)nil)
?嗯,因为编译器对nil
、true
和false
进行了异常处理。。。uff
还请注意,在Smalltalk的某些方言中,编译器会将#((a a))
解释为#(#(a a))
,因此您不必键入那么多磅符号
总结。如果您选择在文字数组中节省一些英镑,请保持一致,编写#((a a))
而不是#(#(a a))
。否则,请完全明确并编写#(#(#(#a#a#a))
您可以将其编写为:
flattenArray: anArray
| ws |
ws = WriteStream on: (Array new).
anArray do: [:subArr| :
subArr notNil ifTrue: [
subArr do: [ :el | ws nextPut: el ]]].
^ws contents.
这里有两个一般性的注释,很少需要通过索引访问集合元素,如果您正在这样做,请停止,并思考是否有更优雅的方法可用。当您想要收集一系列结果时,Second WriteStreams非常方便。您可以将其编写为:
flattenArray: anArray
| ws |
ws = WriteStream on: (Array new).
anArray do: [:subArr| :
subArr notNil ifTrue: [
subArr do: [ :el | ws nextPut: el ]]].
^ws contents.
这里有两个一般性的注释,很少需要通过索引访问集合元素,如果您正在这样做,请停止,并思考是否有更优雅的方法可用。当您想要收集一系列结果时,二次写入团队非常方便。
flatCollect
可以在单个方法调用中解决此问题。您应该为变量提供更多描述性名称,以便代码更易于理解。我可以是outerIndex,y可以是outputinIndex,j可以是innerIndex,z。。。嗯,不管你对Z的意图是什么。除了亚力山大的提示之外,如果你应该自己编写一个扁平集合:考虑不要通过索引访问集合元素,而是直接访问。不要将1改为:list size do:[:index |“dosomething”(list at:index)]
只需编写list do:[:each |“dosomething”with“each”
。对于输出,您可以使用OrderedCollection而不是数组,只需使用add:
来追加元素。您还可以查看Squeak/Pharo中所有收藏都能理解的信息gather:
。两个问题:1)您是否阅读了@Leandro's Excellate to your question,其中您忘记了句号?这里有几点您似乎还没有学到,特别是关于以小写开头的方法名和显式命名(Smalltalk的一个标志)。考虑到您是用英语提问的,作为一种礼貌,您能否努力翻译示例代码中的单词?2) 如果这是关于家庭作业(这很好),请这样说。flatCollect
可以在单个方法调用中解决这一问题。您应该为变量提供更具描述性的名称,以便代码更容易理解。我可以是outerIndex,y可以是outputinIndex,j可以是innerIndex,z。。。嗯,不管你对Z的意图是什么。除了亚力山大的提示之外,如果你应该自己编写一个扁平集合:考虑不要通过索引访问集合元素,而是直接访问。不要将1改为:list size do:[:index |“dosomething”(list at:index)]
只需编写list do:[:each |“dosomething”with“each”
。对于输出,您可以使用OrderedCollection而不是数组,只需使用add:
来追加元素。您还可以查看Squeak/Pharo中所有收藏都能理解的信息gather:
。两个问题:1)您是否阅读了@Leandro's Excellate to your question,其中您忘记了句号?那儿
flattenArray: anArray
| ws |
ws = WriteStream on: (Array new).
anArray do: [:subArr| :
subArr notNil ifTrue: [
subArr do: [ :el | ws nextPut: el ]]].
^ws contents.