Groovyでdef関数からdef関数が呼び出せないのか?

Groovyで特定文字(空白類文字)を含まない部分の長さを調べる
Groovyで特定文字(空白類文字)を含まない部分の長さを調べる その2
で悩んできたのだが、根本的に悩む内容が違ったようだ。

def 関数からdef関数が呼び出せないのか?

def a(){
    println "a"
}
def b(){
    a();
    println "b"
}
a()
b()
groovy:000> load defSample.groovy
===> true
===> true
a
===> null
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate.a() is applicable for argument types: () values: []
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

ちぃ(シャア)

試行錯誤 def b(){}の中身を変更していく

def b(){
    &a()
    println "b"
}
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_parse: 2: unexpected token: & @ line 2, column 5.
       &a();
       ^

1 error

        at java_lang_Runnable$run.call (Unknown Source)

このー(アムロ)

def b(){
    @a()
    println "b"
}
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_parse: 3: unexpected token: println @ line 3, column 5.
       println "b"
       ^

1 error

        at java_lang_Runnable$run.call (Unknown Source)

(なぜだ?)坊やだからさ(シャア)

def b(){
    $a()
    println "b"
}
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate.$a() is applicable for argument types: () values: []
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

やるしかないのか(アムロ)

def b(){
    a().invoke()
    println "b"
}
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate.a() is applicable for argument types: () values: []
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

ガンダム一機エラーひとつに手こずるものだな(ギレン)

def b(){
    a.invoke()
    println "b"
}
ERROR groovy.lang.MissingPropertyException: No such property: a for class: groovysh_evaluate
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
         ...

手の打ちようがありませんな(ギレン)

def b(){
    @a.invoke()
    println "b"
}
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_parse: 3: unexpected token: println @ line 3, column 5.
       println "b"
       ^

1 error

        at java_lang_Runnable$run.call (Unknown Source)

あえて言おうカスであると(ギレン)

def b(){
    invoke(a())
    println "b"
}
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate.a() is applicable for argument types: () values: []
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

正気か(シャア)

def b(){
    $a
    println "b"
}
ERROR groovy.lang.MissingPropertyException: No such property: $a for class: groovysh_evaluate
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

そうそう当たるものでない(シャア)

def b(){
    "$a()"
    println "b"
}
ERROR groovy.lang.MissingPropertyException: No such property: a for class: groovysh_evaluate
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

これはナンセンスだ(シャア)

def b(){
    this.a()
    println "b"
}
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate.a() is applicable for argument types: () values: []
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

まだ、終わらんよ(シャア)

def b(){
    a().curry()
    println "b"
}
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate.a() is applicable for argument types: () values: []
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

それでこそ私のライバルだ(シャア)

普通のメソッドに

def 関数だからだめなのか?
voidに変更して普通のメソッドに。

void c() {
    println "c"
}

void d(){
    c()
    println "d"
}
class test{
    def b(){
        a()
        println "b"
    }
    
}
c()
d()
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate.a() is applicable for argument types: () values: []
        at groovysh_evaluate.b (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

これ以上はやらせん(シャア)


クラスの中に入れる

class test{
    def a(){
        println "a"
    }
    def b(){
        a()
        println "b"
    }
}
t = new test()
t.a()
t.b()
===> test@b64078
a
===> null
a
b
===> null

こ、こいつ、動くぞ(アムロ)



クラス定義してないdef関数、メソッドのスコープってどうなってるんだ??




もう遅い(シャア)



1.6.5

groovy
[D:\workspace\groovy_SandBox]groovy -v
Groovy Version: 1.6.5 JVM: 1.6.0_12
[D:\workspace\groovy_SandBox]groovy defConsoleSample.groovy
a
a
b
groovysh
[D:\workspace\groovy_SandBox]groovysh
Groovy Shell (1.6.5, JVM: 1.6.0_12)
Type 'help' or '\h' for help.
---------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000> load defSample.groovy
===> true
===> true
a
===> null
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate.a() is applicable for argument types: () values: []
        at groovysh_evaluate.b (groovysh_evaluate:2)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...
groovyConsole


スクリプトの内容がgroovyshとは異なったので修正


1.7.5

groovy
[D:\workspace\groovy_SandBox]groovy -v
Groovy Version: 1.7.5 JVM: 1.6.0_12
[D:\workspace\groovy_SandBox]groovy defSample.groovy
a
a
b
groovysh
[D:\workspace\groovy_SandBox]groovysh
Groovy Shell (1.7.5, JVM: 1.6.0_12)
Type 'help' or '\h' for help.
---------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000> load defSample.groovy
===> true
===> true
a
===> null
ERROR groovy.lang.MissingMethodException:
No signature of method: groovysh_evaluate.a() is applicable for argument types: () values: []
Possible solutions: b(), any(), is(java.lang.Object), any(groovy.lang.Closure), wait(), run()
        at groovysh_evaluate.b (groovysh_evaluate:2)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...
groovy:000>
groovyConsole


スクリプトの内容がgroovyshとは異なったので修正





まとめ

def a(){
    println "a"
}
def b(){
    a();
    println "b"
}
a()
b()

上記のコードはgroovyshでは動作しない。

バージョン\実行方法 groovy groovysh groovyConsole
1.6.5 ×
1.7.5 ×

行け忌まわしい記憶とともに(シャア)



実行環境

追加 2010/10/2 12:00

id:waman のばてブのコメントの通り1行で書けばgroovyshでも動いた。
これだけ短いのならOKだけど、現実的じゃないわな。

def a(){println "a"}; def b(){a();println "b"}; a(); b()
groovy:000> def a(){println "a"}; def b(){a();println "b"}; a(); b()
a
a
b
===> null

何と(シャア)


id:kimukou_26からのコメント

groovyConsoleで書いているように、各行で改行したものを保存して
groovyshにD&Dすれば普通に実行できますが<自分も XP
(UTF-8で保存しないとうまく動かない可能性はあるかも)
そもそも[;]って区切りだと思ってましたけど・・

groovyConsole画面とgroovyshで動作させてたのが違ったので、groovyConsole画面を訂正

UTF-8で保存したけど、動かない。。。

groovy:000> load Q044_6_特定の文字を含む部分の長さを調べるUTF8版.groovy
===> true
===> true
===> true
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate.matching_length() is applicable for argument types: (java.lang.String, java.util.regex.Pattern) values: [abc d eee ff
, \s]
        at groovysh_evaluate.unmatching_length (groovysh_evaluate:3)
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

groovyshなら動く

[D:\workspace\groovy_SandBox]groovy D:\workspace\groovy_SandBox\Q044_6_特定の文字を含む部分の長さを調べるUTF8版.groovy
9
4
3
0
13
12
0
9
9
0
0
0
20

認めたくないものだな・・・自分自身の・・・若さ故の過ちというものを・・・(シャア)


関連あるかもしれない記事

最近のキーワード










Groovyの詳細についてはJavadocと以下の書籍を参考にしている。

Groovyイン・アクション
Dierk Konig Andrew Glover Paul King Guillaume Laforge Jon Skeet
毎日コミュニケーションズ
売り上げランキング: 294340


問題自体は以下の書籍のもの。rubyと似てる部分も多いので、ヒントにもなる。
写経でもいいが自分で考えるために他言語の例をGroovyで置き換えてる。

Rubyレシピブック 第2版 268の技
青木 峰郎 後藤 裕蔵 高橋 征義
ソフトバンク クリエイティブ
売り上げランキング: 80467


Groovyイン・アクションを読むならあった方が便利かな。

ブックストッパー

トモエ算盤
売り上げランキング: 614


Rubyレシピブックは「ほんたった」で立ててる