Простой способ динамически заменить заполнитель значением в строках Groovy - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь найти лаконичный и эффективный способ замены заполнителей на значения в Groovy Strings. Но я не могу найти удобное решение для 2 случаев:

  1. Когда String с заполнителем и значением определены в разных классах.
  2. Когда строка передается в качестве аргумента методу и должна быть заменена значением локальной переменной. Вот иллюстрация 2 подходов, которые я попробовал:

      class A {
          static def strPlaceHolder = 'token = ${tokenValue}';
          static def strRefPlaceHolder = "token = ${->tokenRef}";
      }
    
      class B {
          def tokenRef = "token reference as field";
    
          void parseGString(GString str) {
              println str; //fails here. No property tokenRef for class: A. Though I've expected that "this" is B
          }
    
          void parseString(String str) {
              def tokenValue = "token value as local variable";
              println str; //I know why it doesn't work as required. But how to make something similar
          }
    
      }
    
      new B().parseString(A.strPlaceHolder); //token = ${tokenValue}
      new B().parseGString(A.strRefPlaceHolder); //fails, 
    

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете заменить свои поля GString на замыкания и передать эти замыкания своим методам. e.g.:

class A {
    static def strPlaceHolder = { token -> "token = ${token}" }
}

class B {
    def tokenRef = "token reference as field";

    void parseGString(def closure) {
        println closure(tokenRef)
    }

    void parseString(def closure) {
        def tokenValue = "token value as local variable"
        println closure(tokenValue)
    }
}
new B().parseString(A.strPlaceHolder);
new B().parseGString(A.strPlaceHolder);
...