0

Groovyの使い方について初歩的な質問があります。これはシンプルで挑戦しにくいコードスニペットだと思っていました。

  def getName( str ){
    def rslt = "(none)";
    str.eachMatch( /$[TABLE_NAME:[a-zA-Z]]^/ ){
        -> patrn

        if( "(none)" == rslt ){
            rslt = patrn;
        }
    }//eachMatch

    return rslt;
}//getName

アイデアは、渡された文字列 ' str ' と一致する文字列から正規表現に最初に一致したものを ' rslt ' に返すことです。

代わりに、この種のエラーがあります。

Exception in thread "main" groovy.lang.MissingMethodException: 
    No signature of method: All_Tables$_main_closure1.getName() 
      is applicable for argument types: (org.codehaus.groovy.runtime.GStringImpl) 
        values: [Action]

        Possible solutions: getAt(java.lang.String), getAt(java.lang.String) 
          at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:379)
          at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
          at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:730)
          at ...
          at All_Tables$_main_closure1.doCall(All_Tables.groovy:31)
          at ...
          at groovy.sql.Sql.eachRow(Sql.java:1186)
          at ... 
          at All_Tables.main(All_Tables.groovy:26)

呼び出しは、簡単に見えました。

static void main( String args[] ){
    def sql = Sql.newInstance(
            "jdbc:mysql://dev:3306/dbname",
            "dbuser", "dbpass", "com.mysql.jdbc.Driver" );

    sql.eachRow( "SHOW TABLES;" ){
        str = it[0].toString();
        nam = getName( str );
    };

}//main

私が驚いたのは、Groovy ドキュメントに、基本的な Java および Groovy ライブラリ (java.lang.String など) が含まれていることが記載されていることです。それでも、署名は文字列で失敗します。

私はこれをよく知っています。jRuby でこの小さなコードを実行すると、うまくいきます。この「署名」のナンセンスはありません。

...どんなアドバイスも歓迎します:-)

意思

4

1 に答える 1

2

質問から多くのコンテキストを省略しているため、正確にするのは困難ですが、静的なメイン メソッドから非静的メソッドを呼び出そうとしているようです。

getName を static にするか、囲んでいるクラスのインスタンスで呼び出してください

于 2013-05-19T12:08:47.607 に答える