如何在Pharo中实现if-elseif-elseif逻辑?需处理三个条件
在Pharo中实现if-elseif-elseif多分支逻辑
嘿,我来帮你捋清楚这个问题!你之前写的代码是三个独立的ifTrue:ifFalse:判断,这会导致不管前一个条件是否成立,后面的判断都会被执行,这显然不是你想要的if-elseif-elseif逻辑(这种逻辑是只有前面的条件不满足时,才会检查下一个条件)。
下面给你两种正确的实现方式:
方式一:嵌套ifTrue:ifFalse:(最直观的写法)
这是最接近传统if-elseif-else结构的写法,通过嵌套来实现分支递进:
x = 25 ifTrue: [ "当x等于25时执行的代码" Transcript show: 'x是25'; cr ] ifFalse: [ x < 25 ifTrue: [ "当x小于25时执行的代码" Transcript show: 'x小于25'; cr ] ifFalse: [ "剩下的情况就是x大于25了" Transcript show: 'x大于25'; cr ] ]
这个逻辑会先检查x=25,如果成立就执行第一个块;不成立的话,再检查x<25,成立则执行第二个块;如果前两个都不成立,就执行最后一个块(也就是x>25的情况)。
方式二:使用caseOf:otherwise:(更优雅的模式匹配)
Pharo支持caseOf:语法,适合分支较多的场景,写法更简洁:
x caseOf: { [x = 25] -> [ Transcript show: 'x是25'; cr ]. [x < 25] -> [ Transcript show: 'x小于25'; cr ]. } otherwise: [ Transcript show: 'x大于25'; cr ]
这里每个分支的键是一个代码块,Pharo会依次求值这些块,第一个返回true的块对应的动作就会被执行;如果所有分支都不匹配,就执行otherwise:里的代码。
为什么你的原写法不对?
你之前的代码是这样的:
x = 25 ifTrue:[DoSomething] ifFalse:[DoSomething else]. x < 25 ifTrue: [DoSomething] ifFalse:[DoSomething else]. x > 25 ifTrue: [DoSomething ] ifFalse:[DoSomething else].
这三个判断是完全独立的,比如当x=25时,第一个ifTrue会执行,但后面的x<25和x>25的判断也会被触发,这显然不符合你想要的“互斥分支”逻辑。
内容的提问来源于stack exchange,提问作者ludo
相关产品推荐
相关产品推荐

