use*_*514 9 string smalltalk visualworks squeak
我试图比较Smalltalk中的两个字符串,但我似乎做错了什么.
我一直收到这个错误:
未处理的异常:非布尔接收器.继续求真.
stringOne := 'hello'.
stringTwo := 'hello'.
myNumber := 10.
[stringOne = stringTwo ] ifTrue:[
myNumber := 20].
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?
Bos*_*one 17
尝试
stringOne = stringTwo
ifTrue: [myNumber := 20]`
Run Code Online (Sandbox Code Playgroud)
我不认为你在第一行需要方括号
找到很好的解释.整件事就在这里
在Smalltalk中,布尔值(即,True或False)是对象:具体来说,它们是抽象基类Boolean的实例化,或者更确切地说是它的两个子类True和False.所以每个布尔值都有True或False类型,并且没有实际的成员数据.Bool有两个虚函数ifTrue:和ifFalse:,它们将一个代码块作为参数.True和False都会覆盖这些函数; True的ifTrue版本:调用它传递的代码,而False的版本什么都不做(反之亦然ifFalse :).这是一个例子:
a < b
ifTrue: [^'a is less than b']
ifFalse: [^'a is greater than or equal to b']
Run Code Online (Sandbox Code Playgroud)
顺便提一下,方括号中的那些东西本质上是匿名函数.除了它们是对象,因为一切都是Smalltalk中的一个对象.现在,发生了什么,我们称之为"<"方法,参数为b; 这会返回一个布尔值.我们调用它的ifTrue:和ifFalse:方法,作为参数传递我们想要在任何一种情况下执行的代码.效果与Ruby代码的效果相同
if a < b then
puts "a is less than b"
else
puts "a is greater than or equal to b"
end
Run Code Online (Sandbox Code Playgroud)
正如其他人所说,如果你去掉第一组方括号,它就会按照你想要的方式工作。
但是为了更好地解释您遇到的问题:
[stringOne = stringTwo ] ifTrue:[myNumber := 20]
Run Code Online (Sandbox Code Playgroud)
正在将消息传递ifTrue:
给一个块,而块不理解该方法,只有布尔对象才能理解。
如果您首先评估该块,它将评估为一个真正的对象,然后它将知道如何响应:
[stringOne = stringTwo] value ifTrue:[myNumber := 20]
Run Code Online (Sandbox Code Playgroud)
或者你真正应该做什么,正如其他人指出的那样:
stringOne = stringTwo ifTrue:[myNumber := 20]
Run Code Online (Sandbox Code Playgroud)
在发送给它之前,两者都评估stringOne = stringTwo
为。true
ifTrue:[...]