Julia ';Foo';没有与Foo(::Bar)匹配的方法

Julia ';Foo';没有与Foo(::Bar)匹配的方法,julia,Julia,首先,我想指出的是,我无法在精简版的代码中重新创建我的问题。下面的代码按预期工作,所以这篇文章可能不太合适。扩展代码太长,无法在此处发布,因此失败。我将描述我正在尝试做的事情,因为它可能会帮助其他人 我创建了三种类型:Bar、Baz和Qux,其中包含Bar和Baz上的foo方法。我创建一个qux并查询它的foo qux = Wubble.Qux() qux.foo 正如预期的那样,我得到了以下两种方法: foo(bar::Bar) foo(baz::Baz) 然后,当我尝试将qux.foo与

首先,我想指出的是,我无法在精简版的代码中重新创建我的问题。下面的代码按预期工作,所以这篇文章可能不太合适。扩展代码太长,无法在此处发布,因此失败。我将描述我正在尝试做的事情,因为它可能会帮助其他人

我创建了三种类型:Bar、Baz和Qux,其中包含Bar和Baz上的foo方法。我创建一个qux并查询它的foo

qux = Wubble.Qux()
qux.foo
正如预期的那样,我得到了以下两种方法:

foo(bar::Bar)
foo(baz::Baz)
然后,当我尝试将qux.foo与bar或baz一起实际使用时,它会给我一个错误
“foo”没有与foo(::bar)
匹配的方法

遗憾的是,我不能用精简的代码重新创建这个错误,而真正的代码很长。在我错过的这个场景中,有哪些方法可以得到这个错误?它可能与中的方法扩展和函数阴影有关,但我无法修复

module Wibble
type Bar
  data::Number
  function Bar(num::Number=0)
    this = new(num)
    return this
  end
end
end

module Wobble
type Baz
  data::String
  function Baz(vec::String="a")
    this = new(vec)
    return this
  end
end
end

module Wubble
using Wibble
using Wobble
typealias Bar Wibble.Bar
typealias Baz Wobble.Baz

type Qux
  foo::Function
  function Methods(this::Qux)
    function foo(bar::Bar)
      println("foo with bar says ", bar.data)
    end
    function foo(baz::Baz)
      println("foo with baz says ", baz.data)
    end
    this.foo = foo
    return this
  end
  function Qux()
    this = new()
    this = Methods(this)
    return this
  end
end

end

我不确定到底出了什么问题,但有两点可能会有所帮助

  • 您几乎不希望在类型中包含
    函数
    字段:这是来自“基于点”的OOP语言的人经常犯的惯用错误。Julia方法是泛型的,不属于特定类型。这样做没有任何好处,不仅会让人更加困惑(您有很多嵌套的级别来编写可以用两行代码编写的内容),而且会使编译器更难对类型进行推理,从而影响性能

  • 您应该使用
    import Wibble.Bar
    而不是
    typealias
    。如果使用此选项,则不需要使用

  • 外部构造函数更易于用于指定默认参数

简而言之,我的版本是:

module Wibble
type Bar
  data::Number
end
Bar() = Bar(0)
end

module Wobble
type Baz
  data::String
end
Baz() = Baz("a")
end

module Wubble
import Wibble.Bar
import Wobble.Baz

qux(bar::Bar) = println("foo with bar says ", bar.data)
qux(baz::Baz) = println("foo with baz says ", baz.data)

end

我不确定到底出了什么问题,但有两点可能会有所帮助

  • 您几乎不希望在类型中包含
    函数
    字段:这是来自“基于点”的OOP语言的人经常犯的惯用错误。Julia方法是泛型的,不属于特定类型。这样做没有任何好处,不仅会让人更加困惑(您有很多嵌套的级别来编写可以用两行代码编写的内容),而且会使编译器更难对类型进行推理,从而影响性能

  • 您应该使用
    import Wibble.Bar
    而不是
    typealias
    。如果使用此选项,则不需要使用

  • 外部构造函数更易于用于指定默认参数

简而言之,我的版本是:

module Wibble
type Bar
  data::Number
end
Bar() = Bar(0)
end

module Wobble
type Baz
  data::String
end
Baz() = Baz("a")
end

module Wubble
import Wibble.Bar
import Wobble.Baz

qux(bar::Bar) = println("foo with bar says ", bar.data)
qux(baz::Baz) = println("foo with baz says ", baz.data)

end

很好知道,但是C++显式但冗长的封装将很难被忽略。很好地知道,但是C++显式但冗长的封装将很难被忽略。