【问题标题】:GoLang Implement an anonymous function of a custom typeGoLang 实现自定义类型的匿名函数
【发布时间】:2019-05-02 23:27:40
【问题描述】:

我已经在 exercism.io 上完成了 strains 练习。我正在重构我的解决方案。对于上下文:Ints.Keep 接受一个谓词函数,并为谓词函数为真的每个元素返回一个 Ints 类型的过滤切片。相反,Discard 返回谓词不为真的所有元素。 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) })
}

Example usage

现在我正在尝试稍微清理一下。我要创建:

type Predicate func(int) bool

然后我想实现输入为Predicate 的保留和丢弃。当我尝试在 Discard 中创建匿名函数以返回 Keep 时遇到了问题:

func (i Ints) Discard(p Predicate) Ints {
    return i.Keep(Predicate(n int) { return !p(n) })
}

这可能吗?我找不到创建命名函数类型的匿名函数的方法。

【问题讨论】:

    标签: go anonymous-function


    【解决方案1】:

    您可以通过将匿名函数转换为 Predicate 来做到这一点,如下所示:

    func (i Ints) Discard(p Predicate) Ints {
        return i.Keep(Predicate(func(i int) bool { return !p(i) }))
    }
    

    这不是我想要的那么干净,但我敢打赌这是最好的。

    【讨论】:

    • 您实际上并不需要:play.golang.org/p/YdTfOorIc52。我在严格阅读 Type IdentityType definitions 之间遗漏了一些似乎适用于函数类型的内容。
    • @muistooshort,Assignability,第二个项目符号。函数类型并不特殊。例如,它也适用于结构类型,但实际上并没有真正出现:play.golang.org/p/fI_lZI3AMUA
    • @Peter 谢谢,“V 或 T 中的至少一个不是定义的类型”部分特别澄清了一些事情。
    • @Peter 我会努力在任何地方使用定义的类型play.golang.org/p/rKHc8V4qJ70,我想这是更有序的工作方式。您可以使用类型或显式定义,不幸的是不像 PASCAL 那样强制您使用类型,因为每个类型声明都是自己的类型。
    【解决方案2】:

    我猜你误解了用类型替代替换文本,请参阅:

    • f func(int) boolp Predicate 取代
    • funcbool(包装 (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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-05
      • 2015-09-30
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      相关资源
      最近更新 更多