我已完成exercism.io上的strains
练习。我正在重构我的解决方案。对于上下文:Ints.Keep
接受一个谓词函数,并为谓词函数为true的每个元素返回一个Ints类型的过滤切片。相反,Discard返回所有谓词不正确的元素。舍弃返回Keep的倒数。我是这样实现的:
func (i Ints) Keep(pred func(int) bool) (out Ints) {
for _, elt := range i {
if pred(elt) {
out = append(out, elt)
}
}
return
}
func (i Ints) Discard(f func(int) bool) Ints {
return i.Keep(func(n int) bool { return !f(n) })
}
现在我正在尝试将其稍微清理一下。我要创建:
type Predicate func(int) bool
然后我要在输入为Predicate
的情况下实现Keep and Discard。当我尝试在Discard中创建匿名函数以返回Keep时遇到问题:
func (i Ints) Discard(p Predicate) Ints {
return i.Keep(Predicate(n int) { return !p(n) })
}
这可能吗?我找不到创建命名函数类型的匿名函数的方法。
答案 0 :(得分:1)
您可以通过将匿名函数转换为Predicate
来做到这一点:
func (i Ints) Discard(p Predicate) Ints {
return i.Keep(Predicate(func(i int) bool { return !p(i) }))
}
这不是我想要的那么干净,但是我敢打赌这是最好的。
答案 1 :(得分:1)
我想您误解了用替换类型替换文本,请参见:
f func(int) bool
被p Predicate
取代func
和bool
(包装(n int)
)被Predicate
取代。到目前为止,我记得类型替换非常简单,这里不是这样。如果您坚持使用类型,“ Mu太短了”突出了一个很好的例子……尽管使用匿名函数定义是完美的和声明。
一种我认为可能有用的编写代码的方法是:
type Predicate func(int) bool
func (i Ints) Discard(pred Predicate) Ints {
var anonymousComplementFunc Predicate = func(n int) bool {
return !pred(n)
}
return i.Keep(anonymousComplementFunc)
}