Class 找不到错误

Class could not be found error

尽最大努力解决我的问题w/o 在这里发布问题。然而,valadoc 搜索系统最近被破坏了,#vala IRC 频道在涉及 Genie 代码时帮助不大(可以理解)。

瞄准

我正在尝试从 question to 早期的 pandoc gui 应用程序提供一个 OOP Gtk 接口。

问题

我在编译时遇到了错误 pandoc-gui.gs:56.24-56.43: error: The type name `DocumentFileSelector' could not be found\n _document_selector:DocumentFileSelector。 class 稍后在程序中定义,但我似乎无法找到我做错了什么导致它对 init 不可见。

这是初始化例程:

init
    Intl.setlocale()
    Gtk.init (ref args)

    var header = new Header ( "Pandoc GUI" )
    var body = new WorkingFile(  )
    var app = new AppWindow ( header,body )
    var load_new_content_command = new Load( body, document_selector )
    var document_selector = new DocumentFileSelector( app )
    var convert_command = new Convert (document_selector)

    header.add_item( new OpenButton( load_new_content_command ) )
    header.add_item( new ConvertButton ( convert_command ) )

    app.show_all ()
    Gtk.main ()

这是转换 class:

class Convert:Object implements Command

    _document_selector:DocumentFileSelector

    construct ( document_selector:DocumentFileSelector )

        _document_selector = document_selector

    def execute()

        var a = new ToPDF()
        a.convert.begin( document_selector.whichFile(), "output_file.pdf" )

以及接口:

interface Command:Object
        def abstract execute()

interface DocumentSelector:Object
        def abstract select():bool
        def abstract get_document():string

和 DocumentFileSelector class:

class DocumentFileSelector:Object implements DocumentSelector

    _parent:Window
    _uri:string = ""
    _filename:string = ""

    construct( parent:Window )
        _parent = parent

    def select():bool
        var dialog = new FileChooserDialog( "Open file",
                                        _parent,
                                        FileChooserAction.OPEN,
                                        dgettext( "gtk30", "_OK"),
                                        ResponseType.ACCEPT,
                                        dgettext( "gtk30", "_Cancel" ),
                                        ResponseType.CANCEL)

        selected:bool = false
        var response = dialog.run()
        case response
            when ResponseType.ACCEPT
                    _filename = dialog.get_filename()
                    _uri = dialog.get_uri()
                    selected = true
        dialog.destroy()
        return selected

    def whichFile():string
        return _uri

    def get_document():string
        text : string
        len : size_t
        try
                FileUtils.get_contents (_filename, out text, out len)
        except ex : FileError
                print "%s\n", ex.message
        return text

问题

在这种情况下,为什么 DocumentFileSelector 没有被 init 看到?

注意:我仍在弄清楚如何编写一个最小可重现的问题,但是当涉及到所有相互依赖的部分的 OOP 时,它并不像听起来那么简单。出于这个原因,这里是完整的 code 以防我提供的内容不足以提供帮助。

很遗憾,您在 Genie 解析器中遇到了错误。您的代码中有三个地方使用两个缩进来表示一个新的代码块。它们是:

  1. 您的接口定义
  2. DocumentFileSelectorselect()方法中的case when ...
  3. DocumentFileSelectorget_document()方法中的try...except

例如改

interface Command:Object
        def abstract execute()

interface Command:Object
    def abstract execute()

修复这些问题后,您会在代码中遇到许多其他类型的错误,但您应该能够从 Genie 错误消息中找出如何修复这些错误。

Genie 解析器正在读取两个缩进,但由于它没有保留记录它正在寻找两个缩进来标记块的结尾而感到困惑。任何想解决这个问题的人都可以看看 Developing Genie.