2014-06-06 225 views
1

我是Smalltalk的新手,在完成了所有主题的学习之后,我想我已经准备好开始我的项目了,但是当我开始学习时,我刚刚开始在嵌套for循环的时候遇到困难。确实搜索这个issiue,但互联网上的例子并不符合我的需求,这很简单,我只想得到循环的索引来使用它们。 也许这个话题将有助于我和即将启动,多谢你代表我和他们:)嵌套循环Smalltalk

我不知道这是很容易找到的或可行的,但我试图做

1 to: 25 do: [[:a |1 to: 80 do: [:b | a , b printString ,' '],cr]]. 

我只想连接数字为

11 12 13 14 ..180 
21 22 23 ... 
. 
. 
251 252 ... 2580 

将它们用作索引或指针,然后将它们存储在字典中。 但我只是不能做嵌套循环,至少写出他们打印。

我使用Pharo 3.0如果你想知道。

回答

2

我不确定是否有比转换为字符串更好的方法。但是,如果你想要去的路线尝试打印或在工作区检查:

((1 to: 25) collect: [ :a | (1 to: 80) collect: [ :b | a printString , b printString ]]) flattened. 

随着do: aBlock您评估ABLOCK对于接收机中的每一个元素,但
collect: aBlock收集每块评价的结果在一个新的集合。

根据你打算做什么,你可能不得不将结果字符串转换回数字。

+1

感谢您表示过 – iRestMyCaseYourHonor

2

你的代码工作正常(除了丢失#printString消息a和错误的嵌套嵌套),但@MartinW说,你没有使用块的返回值。你可以做什么,而不是(保留尽可能多的你当前的代码尽可能的)是这样的(我喜欢在一个更明确的方式来编码):

Transcript open. 
1 to: 25 do: [ :a | 
    1 to: 80 do: [ :b | 
     Transcript 
      show: a printString; 
      show: b printString; 
      show: ' ' ]. 
    Transcript cr ]. 
+1

的区别谢谢陈脚本打开部分也帮了我很多:) – iRestMyCaseYourHonor

1

一个Squeakish/Pharoish的方式来累积成从一个单一的集合嵌套循环是使用一个中间流,像在这个片段:

String streamContents: [:aStream | 
    1 to: 25 do: [:a | 
     1 to: 80 do: [:b | 
      aStream 
       print: a; 
       print: b; 
       space]]]. 

或者,如果你想创建数量的数组:

Array new: 25*80 streamContents: [:aStream | 
    1 to: 25 do: [:a | 
     1 to: 80 do: [:b | 
      aStream nextPut: (a printString , b printString) asNumber]]]. 
+0

+1这是怎么来的,特别是一个“吱吱声/ Pharoish”的方式? – MartinW

+2

@MartinW使用流不是特别尖锐,但消息streamContents:和new:streamContents:是在Squeak中引入的。至少,它们在st80/Visualworks中不存在。我不知道它是否已经在VW或其他Smalltalk版本的最新版本中引入... –