公開技術情報

[English] [Japanese]

10.3. 引数の省略 編

LuneScript は、nilable 型の引数は関数コール時に省略することが出来ます。

例えば次の関数 func() は、引数を省略してコールできます。

// @lnsFront: ok
fn func( val1:int!, val2:int! ):int {
   when! val1, val2 {
      return val1 + val2;
   }
   when! val1 {
      return val1;
   }
   when! val2 {
      return val2;
   }
   return 0;
}
print( func(1,2) );  // 3
print( func(1) );    // 1
print( func() );     // 0

ここで問題となるのが、 func(1) ならびに func() は意図して引数を省略したのか、 それとも指定し忘れたのかが判断できない、ということです。

引数を省略できること自体は、コーディングの手間を省ける有用な機能ですが、 本来指定すべき引数を指定し忘れたときに、それを検知できなくなってしまう可能性があります。

これを避けるため次のように引数を定義し、 引数の省略を禁止することで指定し忘れを防止することが出来ます。

  • nilable 型の引数を使わない
  • nilable 型の引数の後に、非 nilable 型の引数を定義する

しかし、引数の省略自体を禁止してしまった場合、次の問題があります。

  • コーディングの手間が増えてしまう。
  • 無駄な引数指定が増え、コードの可読性が悪くなる。

引数を省略しつつ、引数の指定し忘れの問題を回避するため、 LuneScript は引数省略の明示を導入します。

引数省略の明示

LuneScript では、引数を省略する場合 ## を使用します。

上の func() をコールする場合、次のようになります。

// @lnsFront: skip
print( func(1,2) );  // 3
print( func(1##) );  // 1
print( func(##) );   // 0

引数を省略している箇所に ## を付加することで、 そこは引数を省略していることを明示します。

なお ## を指定せずに省略している場合、 warning となります。

これにより、引数の省略と、引数の指定し忘れを防止しています。

トランスコンパイル時に -Werror オプションを追加することで、 warning を error として扱います。

また、逆に ## の指定が面倒な場合、 –disable-checking-define-abbr オプションを追加することで ## を指定せずに省略している場合の warning を抑制できます。