2015-08-14 5 views
1

Я хотел бы начать, что мне не удалось воссоздать свою проблему в урезанной версии кода. Приведенный ниже код работает так, как предполагалось, поэтому этот пост, возможно, не очень позитивен. Расширенный код, который слишком длинный для публикации здесь, терпит неудачу. Я опишу, что я пытаюсь сделать, потому что, возможно, это поможет кому-то другому.'Foo' не имеет метода соответствия Foo (:: Bar)

Я создаю три типа: Bar, Baz и Qux, в котором содержится метод foo на барах и базах. Я создаю QUX и запросить его Foo

qux = Wubble.Qux() 
qux.foo 

я получаю следующие два метода, как и ожидалось:

foo(bar::Bar) 
foo(baz::Baz) 

Тогда, когда я пытаюсь реально использовать qux.foo с баром или Баз, его дает мне ошибку 'foo' has no method matching foo(::Bar).

К сожалению, я не могу воссоздать эту ошибку с укороченным кодом, а реальный код незаметно длинный. Каковы различные способы получения этой ошибки в этом сценарии, который я пропустил? Это может быть связано с расширением метода и затенением функции, как в this post, но я не смог исправить ошибку.

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 

ответ

7

Я не совсем уверен, что это происходит не так, но пара моментов, которые могли бы помочь

  • Вы почти никогда не хотите иметь Function поля типа: это обычная идиоматическая ошибка сделанные людьми, поступающими с «островки» на языках «точка-точка». Методы Julia носят общий характер и не относятся к определенному типу. Нет никакого преимущества для этого, и это не только сбивает с толку (у вас много вложенных уровней для написания чего-то, что может быть написано в 2 строках), но это может затруднить компилятору рассуждать о типах, влияя представление.

  • Вы должны использовать import Wibble.Bar вместо typealias. Если вы используете это, вам не нужно using.

  • Внешние конструкторы проще в использовании для указания аргументов по умолчанию.

Короче говоря, моя версия будет:

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 
+0

Хорошо знать, но с ++ явно еще многословным инкапсуляция будет трудно отучиться. –

Смежные вопросы