如何将自定义类型调用函数概括为抽象类型?

问题描述 投票:5回答:1

我有以下模拟设置,抽象类型,具体类型为子类型,以及函数f,它带有两个参数,第一个是Letter

abstract type Letter end

struct A <: Letter end
struct B <: Letter end

f(::A, x) = ('a', x)
f(::B, x) = ('b', x)

a = A()
b = B()

我想为Letter子类定义一个自定义调用函数,它只调用f

(t::A)(x) = f(t, x)
(t::B)(x) = f(t, x)

虽然这有效,但似乎相当多余,特别是考虑到可能有更多的Letter亚型。我的尝试如下,但似乎都没有效果。

julia> (t::Letter)(x) = f(t, x)
ERROR: cannot add methods to an abstract type

julia> (t::T)(x) where T <: Letter = f(t, x)
ERROR: function type in method definition is not a type

如何推广一个调用函数来匹配Letter的任何(具体)子类型?

types julia abstract
1个回答
1
投票

根据Dan的回答,元编程似乎是要走的路

for T in Symbol.(subtypes(Letter))
    @eval (t::$T)(x) = f(t, x)
end

生成每种类型的函数。

要么:

for T in Symbol.(subtypes(Letter))
    c = Char(lowercase(first(String(T))))
    @eval f(::$T, x) = ($c, x)
    @eval (t::$T)(x) = f(t, x)
end

但是,结构/子类型作为枚举的使用是discouraged

© www.soinside.com 2019 - 2024. All rights reserved.