2016-01-11 4 views
1

Я пишу код, это о GLib.Tree. Но не знаю, как использовать метод поиска.Девятник Genie's GLS TreeSearchFunc

У Valadoc есть пример для этого и работает!

ниже мой код:

[indent = 4] 

def cmp (a: string, b: string): int 
    return strcmp (a, b) 
init 
    var t = new Tree of string, string (cmp) 
    t.insert ("a", "aaa") 
    t.insert ("b", "bbb") 

    var needle = "A" 
    fun: TreeSearchFunc = def (k) 
     return strcmp (k.down(), needle.down()) 

    var ret = t.search (fun) 

ОШИБКА!

error: The name down' does not exist in the context of K'

попробовать еще раз:

fun: TreeSearchFunc of string = def (k) 

ОШИБКА!

error: 'GTreeSearchFunc' undeclared

TreeSearchFunc Описание:

public delegate int TreeSearchFunc (K key) 

Если я хочу написать делегат TreeSearchFunc? Как это сделать?

ответ

0

С практической точки зрения вы выполняете поиск без учета регистра GLib.Tree. Вероятно, было бы лучше использовать search_key() функцию:

[indent = 4] 
init 
    var tree = new Tree of (string, string)(cmp) 
    tree.insert("a", "aaa") 
    tree.insert("b", "bbb") 

    result:string = tree.search_key(case_insensitive_compare, "A") 
    print result 

def cmp(a:string, b:string):int 
    return strcmp(a, b) 

def case_insensitive_compare (a:string, b:string):int 
    return strcmp(a.down(), b.down()) 

Как ваш вопрос конкретно просит TreeSearchFunc делегата, то код будет:

[indent = 4] 
init 
    var tree = new Tree of (string, string).full(cmp, free, free) 
    tree.insert("a", "aaa") 
    tree.insert("b", "bbb") 

    result:string = tree.search(case_insensitive_search_for_a) 
    print result 

def cmp(a:string, b:string):int 
    return strcmp(a, b) 

def case_insensitive_search_for_a (k:string):int 
    return strcmp(k.down(), "A".down()) 

Несколько пунктов отметить:

  • TreeSearchFunc версия для делегата должна иметь термин поиска, «А», внутри его области. Пример в Valadoc использует закрытие, которое также включает область охвата, к сожалению, вы не можете этого сделать в Genie
  • версия Valadoc используется Tree.full, поэтому я показал, как это сделать в версии делегата TreeSearchFunc , Это было на случай, если вы не знаете, как используются параметры типа (generics) в Genie

В вашем примере вы по праву попытались использовать замыкание в Genie, назначив его переменной. Это доступно только в версии разработчика Vala, поэтому вы должны загрузить и скомпилировать последнюю версию Vala. Это должно стать доступным при выпуске Vala 0.32. Если вы попытаетесь использовать тот же метод в Vala, вы получите ту же ошибку. Поэтому я думаю, что проблема заключается в компиляторе Vala. В настоящее время Genie не поддерживает анонимные функции, определенные в круглых скобках или фигурных скобках. Если вы заинтересованы в добавлении поддержки, посмотрите на https://bugzilla.gnome.org/show_bug.cgi?id=760492

+0

Я хочу задать еще один вопрос о том, как использовать ** Tree.full **, но вы уже дали мне ответ! Я еще не видел этот синтакс. ** «новый A of (B, C) .D (E)» ** Спасибо. – Zee