2016-01-15 5 views
0

Я пытаюсь реплицировать библиотеку Verbal Expression для python в Genie в качестве упражнения, чтобы узнать, как использовать классы. У меня есть простые классы, подобные тем, которые перечислены в учебнике, но когда дело доходит до метода instatiate в объектно-ориентированном режиме, у меня возникают проблемы. Вот что я пытаюсь:Занятия в Genie

В целях обучения я хочу, чтобы метод назывался add, который ведет себя точно так же, как string.concat().

[indent=4] 
class VerEx : Object 
    def add(strg:string) : string 
     return this.concat(strg) 

Но я получаю ошибку:

verbalexpressions.gs:33.16-33.26: error: The name `concat' does not exist in the context of `VerEx' 

Когда я использую другой подход, как:

class VerEx : Object 
def add(strg:string) : string 
    a:string="" 
    a.concat(strg) 
    return a 

init 
    test:string = "test" 
    sec:string = " + a bit more" 
    print test.VerEx.add(sec) 

я получаю ошибку в последней строке выше текста, предупреждение:

verbalexpressions.gs:84.11-84.21: error: The name `VerEx' does not exist in the context of `string?' 

Я хочу уметь заставить test.add (sec) вести себя одинаково с test.concat (сек), что я могу сделать для этого?

ответ

1

небольшой пример для этого, Примечания: unhandle RegexError в

  1. нового Regex
  2. r.replace

[отступ = 4]

class VerX 
    s: GenericArray of string 

    construct() 
     s = new GenericArray of string 

    def add (v: string): VerX 
     s.add (v) 
     return self 

    def find (v: string): VerX 
     return self.add ("(%s)".printf (v)) 

    def replace(old: string, repl: string): string 
     // new Regex: unhandle RegexError HERE!! 
     var r = new Regex (@"$(self)") 
     // r.replace: unhandle RegexError HERE!! 
     return r.replace(old, old.length, 0, repl) 

    def to_string(): string 
     return string.joinv ("", s.data) 

init 
    var replace_me = "Replace bird with a duck" 
    var v = new VerX 
    print v.find("bird").replace(replace_me, "duck") 

    var result = (new VerX).find("red").replace("We have a red house", "blue") 
    print result 
+0

Благодаря, Zee. Один вопрос, зачем нужна to_string? –

+0

Привет, Если метод класса impl to_string, он будет поддерживать интерполяцию строк. здесь '@" $ (self) "' это строка. Но на самом деле это не было необходимо. Вы можете написать что-то вроде этого: 'var join = string.joinv (" ", s.data); var r = new Regex (join) 'или' var r = new Regex (string.joinv ("", s.data)). – Zee