Squeak Smalltalk-如何使;谈话内容";打印更多的东西?
我正在使用Smalltalk在成绩单窗口中键入1-9乘法表 这是我的代码:Squeak Smalltalk-如何使;谈话内容";打印更多的东西?,smalltalk,squeak,Smalltalk,Squeak,我正在使用Smalltalk在成绩单窗口中键入1-9乘法表 这是我的代码: 1 to: 9 do: [:i| 1 to: i do: [:j| Transcript show: j. Transcript show: ' * '. Transcript show: i. Transcript show: ' = '. Transcript show: j * i. Transcript sho
1 to: 9 do: [:i|
1 to: i do: [:j|
Transcript show: j.
Transcript show: ' * '.
Transcript show: i.
Transcript show: ' = '.
Transcript show: j * i.
Transcript show: ' '.
].
Transcript show: ' '; cr.
].
可以看出,上面的代码虽然工作得很好,但看起来远远不够漂亮和简洁
我曾希望写一些类似的东西:
Transcript show: j '*' i '=' j * i.
不幸的是,他们错了。我记得C有一个很好的方法来处理我的问题
比如,printf(“%d*%d=%d”,j,i,j*i)代码>
在这种情况下,有没有更优雅的方法让Smalltalk代码变得优雅
彼得解决了这个问题。谢谢
更多问题:
1 to: 9 do: [:i|
1 to: i do: [:j|
Transcript show: j.
Transcript show: ' * '.
Transcript show: i.
Transcript show: ' = '.
Transcript show: j * i.
Transcript show: ' '.
].
Transcript show: ' '; cr.
].
如何在Smalltalk中显示“转义字符”
我知道在C中,printf(“%d*%d=%d\n”,j,I,j*I)代码>似乎很好
但是在Smalltalk中,Transcript show:({1}*{2}={3}cr.“格式:{i.j.i*j})。
不好
我该如何解决这个问题呢?我建议进行两项修改:
让代码与通用的流一起工作
,并将其与转录本一起使用
dumpTableOn: aStream
<your code here>
将代码分为两种方法
dumpTableOn: aStream
1 to: 9 do: [:i |
1 to: i do: [:j |
self dump: i times: j on: aStream.
aStream space].
aStream cr]
dump: i times: j on: aStream
aStream
nextPutAll: j asString;
nextPutAll: ' * ';
nextPutAll: i asString;
nextPutAll: ' = ';
nextPutAll: (j * i) asString
下面是上述方法的一个不太详细的版本
dump: i times: j on: aStream
aStream
print: j;
print: ' * ';
print: i;
print: ' = ';
print: j * i
请注意,#print:
不要求我们首先将参数转换为字符串
还请注意,级联不会创建中间的字符串
,而表达式
j asString, '*', i asString, '=', (j*i) asString
创建4个中间字符串(每个#,
一个)。这没什么大不了的,只是我们不会充分利用流协议,它的全部目的是让客户端不再需要连接它这边的东西。我建议两个更改:
让代码与通用的流一起工作
,并将其与转录本一起使用
dumpTableOn: aStream
<your code here>
将代码分为两种方法
dumpTableOn: aStream
1 to: 9 do: [:i |
1 to: i do: [:j |
self dump: i times: j on: aStream.
aStream space].
aStream cr]
dump: i times: j on: aStream
aStream
nextPutAll: j asString;
nextPutAll: ' * ';
nextPutAll: i asString;
nextPutAll: ' = ';
nextPutAll: (j * i) asString
下面是上述方法的一个不太详细的版本
dump: i times: j on: aStream
aStream
print: j;
print: ' * ';
print: i;
print: ' = ';
print: j * i
请注意,#print:
不要求我们首先将参数转换为字符串
还请注意,级联不会创建中间的字符串
,而表达式
j asString, '*', i asString, '=', (j*i) asString
创建4个中间字符串(每个#,
一个)。这没什么大不了的,只是我们不会充分利用流
协议,该协议的全部目的是将客户端从连接其自身事物的需要中解放出来。字符串扩展
比如printf(“%d*%d=%d”,j,i,j*i)
有一些格式化选项,但没有任何可与printf(afaik)相比的选项
更新:转义字符
字符串中没有转义字符,唯一的例外是单引号('),可以通过将其加倍(“代码>'s double!”)来“转义”。
)
要写新行或制表符,您可以
在字符串中键入它
a:='two
行。
(请注意,StackOverflow将选项卡替换为空格:/)
连接字符串
b:=“两行”,字符串cr,字符串选项卡,“行”。
告诉write stream添加它
c:=字符串streamContents:[:流|流字符串扩展
比如printf(“%d*%d=%d”,j,i,j*i)
有一些格式化选项,但没有任何可与printf(afaik)相比的选项
更新:转义字符
字符串中没有转义字符,唯一的例外是单引号('),可以通过将其加倍(“代码>'s double!”)来“转义”。
)
要写新行或制表符,您可以
在字符串中键入它
a:='two
行。
(请注意,StackOverflow将选项卡替换为空格:/)
连接字符串
b:=“两行”,字符串cr,字符串选项卡,“行”。
告诉write stream添加它
c:=String streamContents:[:stream | stream如果您喜欢使用类似于printf
的东西,Squeak有expandMacroWith:方法家族(浏览类字符串)
您的示例可以写成:
1 to: 9 do: [:i|
1 to: i do: [:j|
Transcript show: ('<1p> * <2p> = <3p> ' expandMacrosWith: j with: i with: j*i)
].
Transcript show: ' '; cr.
].
如果您喜欢使用类似于printf
,Squeak有expandMacrosWith:方法家族(浏览类字符串)
您的示例可以写成:
1 to: 9 do: [:i|
1 to: i do: [:j|
Transcript show: ('<1p> * <2p> = <3p> ' expandMacrosWith: j with: i with: j*i)
].
Transcript show: ' '; cr.
].
还请注意,这意味着一个重要的变化:从工作区中的“松散”脚本到类中的方法。这是Smalltalk中的一个相关步骤,因为创建一个类来解决问题是探索领域和获取知识的第一步。还请注意,这意味着一个重要的变化:从“松散”到工作区中的脚本,类中的方法。这是Smalltalk中的一个相关步骤,因为创建一个类来攻击问题是探索域和获取知识的第一步。谢谢。这解决了我的问题。忘记问了。如何在Smalltalk中显示“转义字符”。我知道C,printf(“%d*%d=%d\n”,j,I,j*I);似乎很好。但在Smalltalk中,文本显示:({1}*{2}={3}cr.格式:{i.j.i*j})。不好。我怎么解决这个问题?谢谢。这解决了我的问题。忘了问。如何在Smalltalk中显示“转义字符”。我知道C,printf(%d*%d=%d\n),j,i,j*i);似乎很好。但在Smalltalk中,文本显示:({1}*{2}={3}cr.格式:{i.j.i*j})。不好。我如何解决这个问题?