uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

println -1やprintln[1]はなぜエラーなのか

Groovyで、println -1やprintln[1]を、println(-1)やprintln([1])のつもりで書いても以下のようなエラーになります。

$ groovy -e 'println -1'
Caught: groovy.lang.MissingPropertyException: No such property: println for class: script_from_command_line
at script_from_command_line.run(script_from_command_line:1)

$ groovy -e 'println [1]'
Caught: groovy.lang.MissingPropertyException: No such property: println for class: script_from_command_line
at script_from_command_line.run(script_from_command_line:1)

なぜエラーなのかというと、「expr - 1」という減算の式文や、「expr[1]」のような添字参照の式文と解釈されるからですね。

この問題を回避するには、括弧を省略しないか、

println = new Object()
println.metaClass.methodMissing = {name, arg->
  if (name == 'minus') {
    println(-arg[0])
  }
  else if (name == 'getAt') {
    if (arg[0] instanceof Range) {
      println(arg);
    }
    else if (arg[0] instanceof List) {
      println(arg[0])
    }
    else {
      println([arg[0]])
    }
  }
}

のようにprintlnという変数をつくってやりますw。

groovy:000> println [1..3]
[1..3]
===> null
groovy:000> println -5
-5
===> null