方法列表,如果它们的实现在 Smalltalk 中至少出现两次单词 'assert'

List of methods if their implementation has at least two occurences of a word 'assert' in Smalltalk

我想获取 class 的方法列表,如果它们的实现在 Smalltalk 中至少出现两次单词 'assert'。

有人可以帮我解决这个问题吗?提前致谢!

我不确定 gnu-Smalltalk 的细节,但在 Pharo 中,您可以这样做:

YourClass methods select: [ :method |
    method sourceCode matchesRegex: '.*assert.*assert.*'. ]

这里我使用一个简单的正则表达式来查看我是否可以匹配源代码中的两个“断言”词。

但是,使用 Smalltalk,可以轻松进行更精确的搜索。图像,你想看看一个方法是否发送至少两个 assert: 消息。你可以这样找到这样的方法:

YourClass methods select: [ :method |
    | numAsserts |
    numAsserts := method ast allChildren count: [ :node |
        node isMessage and: [ node selector = #assert: ] ].
    numAsserts >= 2
]

在上面的例子中,对于每个方法,我们简单地计算消息发送的 AST 节点的数量,并有 assert: 选择器。然后我们检查这些节点的数量是否大于等于2。