Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Pharo Smalltalk中用于展平列表的If语句(无返回)_Oop_If Statement_Smalltalk_Pharo - Fatal编程技术网

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.