whileTrue在不需要返回的 GNU Smalltalk 循环中,有什么简单而简洁的方法可以中断?
这是我的代码。如果char_stack为空,我想在第 31 行结束时中断循环。
https://gist.github.com/SYZYGY-DEV333/ea3f5eeb3473927c8faa294bb72a8858
任何帮助将非常感激。
我正在研究一个 Smalltalk 小方法,我希望这个方法迭代字典数组并根据条件返回 True 或 False。
字典数组是一个实例变量,名称为 dictArray。
看起来像: [{'name': toto, 'age': 12}, {'name': tata, 'age': 25}]
所以我想遍历 dictArray 并验证每个项目的名称和年龄。如果匹配,我返回 true else false 和迭代结束。
在python中它应该是这样的:
for item in dictArray:
if item['name'] == aName and item['age'] == aAge:
return True
return False
Run Code Online (Sandbox Code Playgroud)
我找不到这种特殊情况的文档(数组迭代 + 条件 + 返回)
希望可以有人帮帮我!
Object subclass: Node [
|value|
new [
Transcript show: 'Test'.
value := 6.
]
getValue [
^value.
]
set:sth [
value := sth.
]
]
|data|
data := Node new.
Transcript show: (data getValue) printString ; cr. "nil"
data set:5.
Transcript show: (data getValue) printString. "5"
Run Code Online (Sandbox Code Playgroud)
问题是new永远不会调用方法,所以我不能设置值或调用initialize函数.此外之后:
object := Node new. "Not called"
object new. "Here is called"
Run Code Online (Sandbox Code Playgroud)
该方法被调用.如何解决?
我知道如何在SMALLTALK中获取类的元类(with class message ).
但是我如何得到SuperClass一个类(或获得SuperClass某个类的实例)?
我想定义块并以这种方式调用它:
add := [ :a :b |
^(a+b).
].
n := add value: 1 value: 2.
Run Code Online (Sandbox Code Playgroud)
但是当我尝试时,我收到一个错误:
$ gst 3.1.st
Object: 3 error: return from a dead method context
SystemExceptions.BadReturn(Exception)>>signal (ExcHandling.st:254)
SystemExceptions.BadReturn class(Exception class)>>signal (ExcHandling.st:151)
SmallInteger(Object)>>badReturnError (Object.st:1389)
UndefinedObject>>executeStatements (3.1.st:3)
Run Code Online (Sandbox Code Playgroud)
如何调用 GNU Smalltalk 中的函数?
好吧,我删除了 return 语句,并且这段代码工作正常。但是当我尝试定义更复杂的函数时,例如:
nod := [ :a :b |
(a=b) ifTrue: [a].
(a>b) ifTrue: [nod value: (a-b) value: b].
(a<b) ifTrue: [nod value: a value: (b-a)].
].
n := nod value: 1 value: 2.
n printNl.
Run Code Online (Sandbox Code Playgroud)
它打印为零。如果我用“提前退出”来定义: …
一个以前的SO问题提出了有关这成语是在执行efficency方面更好的时间问题:
[ (var := exp) > 0 ] whileTrue: [ ... ]
Run Code Online (Sandbox Code Playgroud)
与
[ var := exp.
var > 0 ] whileTrue: [ ... ]
Run Code Online (Sandbox Code Playgroud)
直观地看,第一种形式似乎在执行期间更有效,因为它节省了一个额外的声明(第二种形式).在大多数Smalltalks中都是如此吗?
试着用两个愚蠢的基准测试:
| var acc |
var := 10000.
[ [ (var := var / 2) < 0 ] whileTrue: [ acc := acc + 1 ] ] bench.
| var acc |
var := 10000.
[ [ var := var / 2. var < 0 ] whileTrue: [ acc := acc + …Run Code Online (Sandbox Code Playgroud) smalltalk ×6
benchmarking ×1
break ×1
loops ×1
pharo ×1
squeak ×1
visualworks ×1
while-loop ×1