2

Groovyは初めてです。私はこれを達成したい:

def a = { assert 1 == 1 }

def method(def a)
{
    println a
}
method(a)

println印刷しConsoleScript1$_run_closure1@72e9108fます。しかし、私はそれが印刷されることを望みますassert 1 == 1。それは可能ですか?

4

3 に答える 3

6

あなたが保存する場合、これの複製として私がリンクした答えを使用して:

import groovy.inspect.swingui.AstNodeToScriptVisitor

def a = { assert 1 == 1 }

def method( def a ) {
  new StringWriter().with { writer ->
    a.metaClass.classNode.getDeclaredMethods("doCall")[0].code.visit new AstNodeToScriptVisitor( writer )
    println "{\n$writer}"
  }
}

method( a )

test.groovy次に、ファイルに次のようにします。

groovy test.groovy

次の出力が得られます。

{
assert 1 == 1 : null
return null
}

これは、私が思うに近いものです... code変数(Groovyステートメントクラス)の位置データを使用せずに、行/列番号を取得し、ファイルをテキストとして解析して抽出します。 。

于 2012-10-01T11:20:48.017 に答える
1

関数でtoString()を呼び出すと、そのソースコードが出力されるJavascriptのような機能を探しています。

GroovyはJVMバイトコードにコンパイルされます。groovyコンパイラは、コンパイルされたJVMクラスファイルにソースコードを保持しません。

于 2012-10-01T11:01:03.533 に答える
0

Odersky&Coの著書「Programmingin Scala」には、Scalaで書かれた有名な例があります。

基本的に、あなたはしなければなりません:

  • ファイルを一覧表示する
  • *.groovyに一致するファイルごとに
  • 必要な行をトリミング/grepします

Groovy SDKにはdirectory.eachFileMatch、正しいファイルを見つけることができるGroovyメソッドとFile.filterLine()、正しい行を取得できるメソッドがあります。

于 2012-10-01T11:22:25.690 に答える