GoLang Реализовать анонимную функцию пользовательского типа - PullRequest
2 голосов
/ 03 мая 2019

Я выполнил упражнение strains на exercism.io.Я рефакторинг своего решения.Для контекста: Ints.Keep принимает функцию предиката и возвращает отфильтрованный фрагмент типа Ints для каждого элемента, для которого функция предиката имеет значение true.И наоборот, 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) })
}

Пример использования

Теперь я пытаюсь немного его почистить.Я хочу создать:

type Predicate func(int) bool

Затем я хочу реализовать Keep and Discard, где вводом является Predicate.Я сталкиваюсь с проблемой, когда пытаюсь создать анонимную функцию в Discard, чтобы вернуть Keep:

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

Возможно ли это?Я не могу найти способ создать анонимную функцию именованного типа func.

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Я полагаю, вы неправильно понимаете замену текста с подстановкой типа, см .:

  • f func(int) bool заменяется на p Predicate
  • func и bool (упаковка *)1010 *) каким-то образом заменяется на Predicate.

Насколько я помню, подстановка типов очень проста, и здесь дело обстоит не так ... "Му слишком коротко" - хороший пример, есливы настаиваете на использовании типа ... хотя идеально использовать определения и объявления анонимных функций.

Еще один способ написать код, который, по моему мнению, может оказаться полезным, это:

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 голос
/ 03 мая 2019

Вы можете сделать это, приведя анонимную функцию как Predicate Примерно так:

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

Это не так чисто, как я хотел, но держу пари, что это лучше.

...