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) ...
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>
まとめ
def a(){ println "a" } def b(){ a(); println "b" } a() b()
上記のコードはgroovyshでは動作しない。
バージョン\実行方法 | groovy | groovysh | groovyConsole |
---|---|---|---|
1.6.5 | ○ | × | ○ |
1.7.5 | ○ | × | ○ |
行け忌まわしい記憶とともに(シャア)
実行環境
- OS:Windows XP
- Groovy Version: 1.6.5/1.7.5
- JVM: 1.6.0_12
追加 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でdef関数からdef関数が呼び出せないのか?
Groovyで特定文字(空白類文字)を含まない部分の長さを調べる その2
Groovyで特定文字(空白類文字)を含まない部分の長さを調べる
Groovyで特定文字(空白類文字)を含む部分の長さを調べる
Groovyでmapで値を取得する方法のまとめ
Groovyではてブカウンター風はてなスターカウンターを作成する 10)完結編 作成したはてなスターカウンターをはてダに貼り付ける
Groovyではてブカウンター風はてなスターカウンターを作成する 9)はてブカウンターと同じ15色に対応する
Groovyではてブカウンター風はてなスターカウンターを作成する 8)APIで取得したスター数をはてなスターカウンターに描く
Groovyではてブカウンター風はてなスターカウンターを作成する 7)はてなスターAPIを使用してはてなスター数を取得する
Groovyではてブカウンター風はてなスターカウンターを作成する 6)カウンターに数字を描く
最近のキーワード
- API
- JVM
- Ruby
- URI
- UTF-8
- Windows XP
- XML-RPC
- codehaus
- jsonic
- regex
- すもももももも
- はてなスター
- はてなスターカウントAPI
- はてなダイアリー
- はてなフォトライフ
- はてブ
- ほんたった
- ソフトバンク クリエイティブ
- 正規表現
- 毎日コミュニケーションズ
Groovyの詳細についてはJavadocと以下の書籍を参考にしている。
問題自体は以下の書籍のもの。rubyと似てる部分も多いので、ヒントにもなる。
写経でもいいが自分で考えるために他言語の例をGroovyで置き換えてる。
Groovyイン・アクションを読むならあった方が便利かな。