我是Smalltalk的新手,并尝试不使用if语句! 在Python上我会写:
try:
element = LinkedList.remove()
except:
element = "nil"
finally:
return element
Smalltalk中的等价物是什么?
答案 0 :(得分:7)
简短回答:
^aLinkedList remove: aLinkOrObject ifAbsent: [nil]
请注意,在Smalltalk中,支持删除元素的所有集合也支持remove:ifAbsent:
消息。第一个参数是要删除的元素,第二个参数是一个块,用于处理元素不在集合中的情况。
更一般地说,处理Smalltalk异常的方法遵循以下模式:
[<Smalltalk expression>] on: Error do: [:ex | <handle ex>]
更一般地说,参数Error
可以替换为Exception
层次结构的任何子类,这意味着您的代码只能处理某些类型的异常。
异常处理是Smalltalk中的一个主题,因此请将此答案作为一个提示来帮助您编写一些初步的Smalltalk代码。
修改强>
@SeanDeNigris的回答和评论让我意识到我的答案至少在一个方面是不完整的:我们如何确定列表的第一个元素?实际上,使用remove:ifAbsent:
的表达式对第一个参数没有任何说明,原始问题将其标识为第一个元素。要完成答案,我们还必须解决此问题。
我们可以尝试第一次尝试:
^aLinkedList remove: aLinkedList first ifAbsent: [nil]
但问题是如果列表恰好为空,则消息aLinkedList first
将发出错误信号。换句话说,ifAbsent:
部分将毫无用处。所以,正如肖恩所说,我们有两种选择。在第一个中,我们使用条件逻辑来区分列表是否为空:
^aLinkedList isEmpty
ifTrue: [nil]
ifFalse: [aLinkedList remove: aLinkedList first]
第二种选择包括使用例外:
^[aLinkedList remove: aLinkedList first] on: Error do: [nil]
此时我们面临的问题是哪种选择更好。适用的一个好标准是简单性。哪种解决方案更简单?显然是第一个。错误处理是一种使用一些非平凡机器的高级功能。第一种解决方案依赖于基本条件逻辑。此外,如果我们事先知道如果列表为空,那么唯一预期的错误将会发生,那么假装我们无法预料到异常是什么意思。在这方面,使用例外和on:do:
是过度的,我们应该在这里避免使用。
答案 1 :(得分:3)
正如Leandro所说,对你的问题的字面答案是将陈述包装在#on:do:
块中
但是......除非你这样做是像卡塔式的运动,否则有时可以使用“if”!在你的Python示例中,系统似乎为您提供了一些内置支持,在Smalltalk中可能类似#removeFirstUnlessEmpty
(您可以实现隐藏丑陋)。一旦你不得不诉诸例外,我不会说这比使用if更好。
如果它让你感觉更好,在Smalltalk #ifTrue:是一条消息,而不是一个声明,所以它不会影响你的代码的纯度......除非你嵌套它们,这只是味道不佳; )