Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Julia中定义抽象类型的默认方法

在Julia中定义抽象类型的默认方法
EN

Stack Overflow用户
提问于 2021-10-30 12:07:09
回答 1查看 64关注 0票数 5

在Julia中,如何在单独的模块中提供方法的默认实现?例如,如果抽象类型位于相同的模块中,我就没有问题,这就像我期望的那样工作:

代码语言:javascript
运行
AI代码解释
复制
abstract type Foo end

howdy(x::Foo)::Union{String, Nothing} = nothing

struct Bar <: Foo end

function howdy(x::Bar)::Union{String, Nothing}
    "I'm a Bar!"
end

struct Baz <: Foo end

if abspath(PROGRAM_FILE) == @__FILE__
    bar = Bar()
    s = howdy(bar)
    if isa(s, String)
        println(s)
    end
    baz = Baz()
    t = howdy(baz)
    if isa(t, String)
        println(t)
    end
end

然而,一旦我把抽象类型放入它自己的模块中,它就不再起作用了:

src/qux.jl中,我放了:

代码语言:javascript
运行
AI代码解释
复制
module qux

abstract type Foo end

howdy(x::Foo)::Union{String, Nothing} = nothing

export Foo, howdy
end # module

然后在reproduce.jl中我添加了:

代码语言:javascript
运行
AI代码解释
复制
using qux

struct Bar <: Foo end

function howdy(x::Bar)::Union{String, Nothing}
    "I'm a Bar!"
end

struct Baz <: Foo end

if abspath(PROGRAM_FILE) == @__FILE__
    bar = Bar()
    s = howdy(bar)
    if isa(s, String)
        println(s)
    end
    baz = Baz()
    t = howdy(baz)
    if isa(t, String)
        println(t)
    end
end

然后我得到:

代码语言:javascript
运行
AI代码解释
复制
julia --project=. reproduce.jl
I'm a Bar!
ERROR: LoadError: MethodError: no method matching howdy(::Baz)
Closest candidates are:
  howdy(::Bar) at ~/qux/reproduce.jl:5
Stacktrace:
 [1] top-level scope
   @ ~/qux/reproduce.jl:18
in expression starting at ~/qux/reproduce.jl:11
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-30 12:52:16

你的问题在Julia手册中有here解释。

问题是在您的代码中,正如您在这里看到的:

代码语言:javascript
运行
AI代码解释
复制
julia> module qux

       abstract type Foo end

       howdy(x::Foo)::Union{String, Nothing} = nothing

       export Foo, howdy
       end # module
Main.qux

julia> using .qux

julia> struct Bar <: Foo end

julia> function howdy(x::Bar)::Union{String, Nothing}
           "I'm a Bar!"
       end
howdy (generic function with 1 method)

julia> methods(howdy)
# 1 method for generic function "howdy":
[1] howdy(x::Bar) in Main at REPL[4]:1

julia> methods(qux.howdy)
# 1 method for generic function "howdy":
[1] howdy(x::Foo) in Main.qux at REPL[1]:5

您有两个不同的howdy函数,每个函数都有一个方法。一个在qux模块中定义,另一个在Main模块中定义。

您要做的是向qux模块中定义的howdy函数添加一个方法。我通常会通过使用模块名称限定导出的函数名来完成此操作,因为这是一种明确的方式来表明您想要做什么:

代码语言:javascript
运行
AI代码解释
复制
julia> module qux

       abstract type Foo end

       howdy(x::Foo)::Union{String, Nothing} = nothing

       export Foo, howdy
       end # module
Main.qux

julia> using .qux

julia> struct Bar <: Foo end

julia> function qux.howdy(x::Bar)::Union{String, Nothing}
           "I'm a Bar!"
       end

julia> methods(qux)
# 0 methods:

julia> methods(howdy)
# 2 methods for generic function "howdy":
[1] howdy(x::Bar) in Main at REPL[4]:1
[2] howdy(x::Foo) in Main.qux at REPL[1]:5

正如您现在看到的,您有一个具有两个方法的单个howdy函数,所有方法都将按您所希望的那样工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69781770

复制
相关文章
Swift 中的抽象类型和方法
在面向对象的编程中,抽象类型提供了一个基础实现,其他类型可以从中继承,以获得某种共享的、共同的功能。抽象类型与普通类型的区别在于,它们永远不会被当作原样使用(事实上,一些编程语言甚至阻止抽象类型被直接实例化),因为它们的唯一目的是作为一组相关类型的共同父类。
Swift社区
2022/05/19
7940
Swift 中的抽象类型和方法
在面向对象的编程中,抽象类型提供了一个基础实现,其他类型可以从中继承,以获得某种共享的、共同的功能。抽象类型与普通类型的区别在于,它们永远不会被当作原样使用(事实上,一些编程语言甚至阻止抽象类型被直接实例化),因为它们的唯一目的是作为一组相关类型的共同父类。
韦弦zhy
2022/03/30
8500
java抽象方法,静态方法,默认方法
在了解抽象方法和默认方法之前需要先了解什么是接口 接口是功能的集合,是一种数据类型 接口里定义方法默认是public abstract(抽象方法),没有具体的实现,实现由实现类实现,且必须实现(静态方法和默认方法除外)
许喜朝
2021/03/02
2.7K0
【Kotlin】接口和抽象类 ( 接口属性和方法定义 | 接口默认方法实现 | 抽象类 )
Kotlin 中使用 interface 关键字 定义接口 , 接口中的 所有 属性 和 函数 默认都是 open 的 , 在 接口 实现类中 , 必须 使用 override 重写 接口的 属性 和 函数 ;
韩曙亮
2023/03/30
1.4K0
Julia in Jupyter——在Notebook中配置使用Julia语言
我刚接触Jupyter Notebook的时候曾经在别处看到一个说法,大意是Jupyter是Julia、Python、R三种语言缩写的合并,当时对Python比较熟悉,R略微了解,Julia则是一窍不通。虽然偶尔也会好奇为什么Jupyter以Julia为首,但是关于Julia的消息实在不多,也就没去深入了解,大概单纯就是为了靠近Jupiter这个单词吧。
不二小段
2018/10/08
6.7K0
Julia in Jupyter——在Notebook中配置使用Julia语言
Julia(类型系统)
传统上,类型系统分为两个截然不同的阵营:静态类型系统和动态类型系统,在静态类型系统中,每个程序表达式必须在执行程序之前具有可计算的类型;在动态类型系统中,直到运行时对类型的任何了解,直到实际值该程序可以操纵。面向对象通过允许编写代码而无需在编译时知道精确的值类型,从而在静态类型的语言中提供了一定的灵活性。编写可以在不同类型上运行的代码的能力称为多态性。经典动态类型语言中的所有代码都是多态的:只有通过显式检查类型或对象在运行时无法支持操作时,才可以限制任何值的类型。
云深无际
2021/04/14
5.6K0
Julia(类型系统)
6 Julia 类型
Julia中没有class,也没有子类型的继承关系,所有具体类型都是最终的,并且只有抽象类型可以作为其超类型。Julia中的继承是继承行为,而不是继承结构。
猫叔Rex
2020/06/30
9360
6 Julia 类型
java interface 里面的抽象方法默认public[通俗易懂]
①interface 里声明的方法,会自动在方法名之前加上 public abstract
全栈程序员站长
2022/11/10
6210
Ts中抽象类和抽象方法
抽象类不能被实例 用abstract关键字定义抽象类和抽象方法 定义的抽象方法不去实现,但继承的子类必须去实现
明知山
2021/04/08
1.1K0
详解Java中的抽象类和抽象方法
我们都知道要求正方形的面积,直接使用面积公式边长的平方即可,同理三角形的是底乘高除以2,圆的面积是**
code随笔
2022/03/31
1.8K0
详解Java中的抽象类和抽象方法
5 种在 Vue 3 中定义组件的方法
英文 | https://fadamakis.com/the-5-ways-to-define-a-component-in-vue-3-aeb01ac6f39f
winty
2023/08/23
4160
5 种在 Vue 3 中定义组件的方法
【C++】函数参数扩展 ( 默认参数 | 默认参数定义规则 | 默认参数定义在参数列表末尾 )
" 默认参数 " 概念 : C++ 语言 中的 函数 , 可以在 声明 函数时 , 为 函数参数 定义一个默认值 ;
韩曙亮
2023/10/15
8750
【C++】函数参数扩展 ( 默认参数 | 默认参数定义规则 | 默认参数定义在参数列表末尾 )
TypeScript 中的数组类型定义
在 TypeScript 中声明和初始化数组也很简单,和声明数字类型和字符串类型的变量也差不多,只不过在指定数组类型时要在类型后面加上一个中括号 []
Qwe7
2022/03/19
5.5K0
Java8中的默认方法
大家好啊,我是汤圆,今天给大家带来的是《Java8中的默认方法》,希望对大家有帮助,谢谢
汤圆学Java
2021/04/14
6030
Java8中的默认方法
在Pandas中更改列的数据类型【方法总结】
有什么方法可以将列转换为适当的类型?例如,上面的例子,如何将列2和3转为浮点数?有没有办法将数据转换为DataFrame格式时指定类型?或者是创建DataFrame,然后通过某种方法更改每列的类型?理想情况下,希望以动态的方式做到这一点,因为可以有数百个列,明确指定哪些列是哪种类型太麻烦。可以假定每列都包含相同类型的值。
kirin
2021/04/19
20.9K0
在Pandas中更改列的数据类型【方法总结】
Java中抽象类和接口定义
* 当多个类中出现相同功能,但是功能主提体不同。 这时可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。
用户7886150
2020/12/04
5670
在C#中面向抽象编程
“面向抽象编程”在面向对象语言中是非常关键的一个概念和方法。本系列文档将结合实际用例,让读者体会到在使用C#语言时,如何良好的运用这个概念和方法来编写可维护性更好的代码。
newbe36524
2020/03/16
1.1K0
C#中抽象类与抽象方法的作用与实例
在C#中,允许把类和方法声明为抽象类与抽象方法,具体的声明方法是在类名或方法名前加上abstract关键字。 那么我们什么时候应该用抽象类呢? 如果一个类设计的目点是用来被其它类继承的,它代表一类对象的所具有的公共属性或方法,那个这个类就应该设置为抽象类。 抽象类与其它的类有什么区别呢? 抽象类是不能够被实例化的。如果一个类中包含有抽象方法,那么这个类一定要声明为抽象类。同时,抽象方法一定需要在子类中重写,让抽象方法成为一个具体的实实在在的方法。 比如,我们要声明一个动物类animal,然后有其它的类Cat(猫),Dog(狗)等具体的类来继承它,那么这个动物类就应该声明为抽象类。因为animal只是一个名词,不代表任何具体的对象,它只是代表所有动物所拥有的共同特征,所以animal类是根本不可能被实例化的。同时,如果所有动物都必须声明"叫"这样一个方法的话,那么,我们可以在animal类中声明一个抽象方法shout(),因为抽象方法是必须在子类中重写的,所以这就限制了所有继承自animal类都必须重写shout()方法。 实例: 声明Animal类
zls365
2020/08/19
1.8K0
(六)处理 emit 传递的方法类型和computed 类型定义
一、定义 emits 类型&原生 DOM 元素类型 触发自定义事件 <script setup lang="ts"> function 事件名(传递的字段名: 类型) { // 逻辑代码 ... } </script> 二、computed 计算属性类型定义 computed 可以根据返回值来自动推断类型,所以就不用手动定义类型了 <script setup lang="ts"> import { computed } from 'vue' const xxx = computed(()
老怪兽
2023/02/22
6050
点击加载更多

相似问题

在Julia中如何定义抽象类型的所有参数子类型的方法?

11

具有抽象类型和定义类型的Julia类型

23

Julia中的抽象参数类型

10

优化中的Julia抽象类型?

10

在Julia中抽象类型数组的使用

38
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档