我已经完成了对exercism.io的
1 2 3 4 5 6 7 8 9 10 11 12 | 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) }) } |
用法示例
现在我正在尝试将其稍微清理一下。我要创建:
1 | type Predicate func(int) bool |
然后我要在输入为
时遇到问题
1 2 3 | func (i Ints) Discard(p Predicate) Ints { return i.Keep(Predicate(n int) { return !p(n) }) } |
这可能吗?我找不到创建命名函数类型的匿名函数的方法。
我想您误解了用替换类型替换文本,请参见:
-
f func(int) bool 被替换为p Predicate -
func 和bool (包装(n int) )以某种方式被Predicate 代替。
到目前为止,我记得类型替换非常简单,这里不是这种情况。如果您坚持使用类型," Mu太短"突出了一个很好的例子...尽管使用匿名函数定义是完美的和声明。
您可能会觉得有用的另一种编写代码的方法是:
1 2 3 4 5 6 7 8 | 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) } |
您可以通过将匿名函数转换为
1 2 3 | func (i Ints) Discard(p Predicate) Ints { return i.Keep(Predicate(func(i int) bool { return !p(i) })) } |
这不是我想要的那么干净,但是我敢打赌这是最好的。
- 您实际上不需要:play.golang.org/p/YdTfOorIc52。我在严格理解类型标识和类型定义之间缺少某种似乎适用于函数类型的东西。
- @muistooshort,可分配性,第二点。函数类型并不特殊。例如,它也适用于结构类型,但实际上并没有真正实现:play.golang.org/p/fI_lZI3AMUA
- @Peter谢谢," V或T的至少一个不是定义的类型"部分特别阐明了几件事。
- @Peter我会努力在play.golang.org/p/rKHc8V4qJ70的所有地方使用定义的类型,我想这是更有序的工作方式。您可以使用类型或显式定义,不幸的是,它不像PASCAL那样使您不得不使用Type,因为每个类型声明都是自己的类型。