CodeZine(コードジン)

特集ページ一覧

ここがポイント!Curlプログラミング
null値の取り扱い(キャスト・マクロの利用)

第2回

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/09/29 14:00

 Curl言語は、変数型を指定する場合「null値を許容する変数」と「null値を認めない変数」の2種類を区別します。それらの使い分けに便利なマクロの指定方法やキャスト方法について見ていきましょう。

目次

これまでのTips

はじめに

 今回は、Curl言語の中でも特徴的なnull値の取り扱いについてご説明したいと思います。

null値の扱い

 プログラマの方であれば、NullDereferenceException(NullPointerException)は、かなりなじみのある例外エラーだと思います。変数にインスタンスが設定されていない、すなわちnull値が入っている状態で、プロパティを設定したり、メソッドを呼んだりすることで発生します。

 Java等の言語では、変数にnull値が入ることを想定してプログラムを書くか否かはプログラムを作成した人次第であり、引数などからそれを判断することができません。そこで、提供されたクラスライブラリなどを使う場合、プロシージャやメソッドの引数にnull値を許すかどうかを、APIのドキュメントを頼りに判断することになります。多くの場合、実行してみなければどのような結果になるのか分かりません。

 それに対してCurl言語は、変数にnull値を許すか否かを明示する仕様になっているため、引数の型を見るだけでnull値を渡せるかどうか判断することができます。これにより、検証用のコードを書かなくて済みますし、null値によるExceptionの発生をかなり減らすことができます。その代わり、自分がコードを書く場合に、常にnull値をとるのかとらないのかを明確に意識する必要があります。

 Curl言語は、null値の扱いについて、いくつかのマクロが提供されています。これらのマクロを使うことで効率的にコードを書くことができます。

 具体的に見ていきましょう。null値をとる変数型は、先頭に#を付けます。文字列クラスを例にしますと、null値をとらない文字列クラスはString型、null値をとる文字列クラスは#String型になります。文字数を数えるプロシージャの引数として、この2つの変数を渡してみます。

コード1
{curl 7.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{applet manifest = "../manifest.mcurl",
    {compiler-directives careful? = true}
}

|| 文字数を返すプロシージャ
{define-proc public {length str:String}:int
        {return str.size}
}
        
|| 呼び出し可能
str0の文字数:
{value
    let str0:String = "abc"
    {length str0}
}

|| エラー発生
str1の文字数:
{value
    let str1:#String = "abc"
    {length str1} || エラー
}

 プロシージャの引数には、String型を指定しています。String型の変数を引数にプロシージャを呼び出すことができますが、null値を含む#String型の変数を渡すと、図1のようにコンパイルエラーとなります。コンパイラはString型と#String型を別の型として処理しているためです。

図1
図1

asa演算子

 String型の引数に#String型の変数を引き渡すには、asa演算子を使って#String型をString型に変換(キャスト)します。asa演算子を使って明示的なキャストをすることで先ほどのプロシージャを実行できます。

コード2
{curl 7.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}

|| 文字数を返すプロシージャ
{define-proc public {length str:String}:int
        {return str.size}
}

|| 実行可能
strの文字数:
{value
    let str:#String = "abc"
    {length str asa String} || Stringへのキャスト
}

 asa演算子を使ってキャストを行った場合、変数にnullが入っていますとExceptionが発生します。asa演算子を使うことで問題なのが、クラス名を記述しなければならないことです。String型の場合はクラス名が短いので、"asa String"を付けてもさほど手間ではありません。しかし、ハッシュテーブルのような長いクラス名の引数を呼び出すような場合や、変数のクラス名を途中で変更した場合など、"asaクラス名"をソースコードに記述していくのは、コードの記述量が増えてしまいますし、メンテナンス性も下がります。

 そのような場合、asa演算子を使ってキャストする代わりにnon-nullマクロを使います。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2009/09/16 14:39 言葉の言い回しなど

あなたにオススメ

著者プロフィール

  • 久保田 一郎(クボタ イチロウ)

    財団法人日本自動車研究所電算システムGr所属。Macintosh HyperCardとOracleを使った業務システムの開発から始まって、4D、Java、AIRを経由してCurl に到達。

バックナンバー

連載:知っておきたいCurl文法の要点
All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5