Cocoa API を使用していると、引数にポインタ変数を渡さなければいけないときがあります。多くは NSError* error;
のような変数が必要になるケースでしょうか。Ruby にはポインタ変数を扱うことができるクラスが存在しないため、MacRuby では Pointer クラスが追加されています。
Pointer クラスを使用して、Objective-C の NSError* error;
と等しい変数を用意するには以下のような記述になります。
1
|
|
Pointer.new
の引数の @
は、「オブジェクトのポインタ変数をつくりなさい」と指示しています。@
のほかにも種類があり Type Encodings で確認することができます。
Pointer クラスについて、もう少し詳しい例を下に示します。
1 2 3 4 5 6 7 8 9 10 11 |
|
NSString.stringWithContentsOfURL
でエラーが発生すると、error[0]
にエラー内容が格納されます。
char* name[5];
のようなインスタンスを作成するには、以下のように Pointer.new
の第 2 引数でサイズを指定します。
1 2 3 4 5 6 |
|
NSRect *rect[2];
のような構造体のポインタ変数のインスタンスは、以下のように作成できます。
1
|
|
構造体の内容を正確に把握しなければ、変数を用意することができません。
そこで、NSRect.type
と構造体に対して type
メソッドを実行すると "{CGRect={CGPoint=dd}{CGSize=dd}}"
と構造体の Type を取得することができるようになっています。上の例は以下のように書くことができます。
1
|
|
ポインタ種類の別名
@
ではどのようなポインタとなるのかわかりにくいため、MacRuby では Pointer.new('@')
を以下のように書くこともできます。
1
|
|
以下の表のように別名が用意されています。
内容 | ポインタ | 別名 |
---|---|---|
char | Pointer.new(‘c’) | Pointer.new(:char) |
unsigned char | Pointer.new(‘C’) | Pointer.new(:uchar) |
short | Pointer.new(’s’) | Pointer.new(:short) |
unsigned short | Pointer.new(‘S’) | Pointer.new(:ushort) |
int | Pointer.new(‘i’) | Pointer.new(:int) |
unsigned int | Pointer.new(‘I’) | Pointer.new(:uint) |
long | Pointer.new(‘l’) | Pointer.new(:long) |
unsigned long | Pointer.new(‘L’) | Pointer.new(:ulong) |
long long | Pointer.new(‘q’) | Pointer.new(:long_long) |
unsigned long long | Pointer.new(‘Q’) | Pointer.new(:ulong_long) |
float | Pointer.new(‘f’) | Pointer.new(:float) |
double | Pointer.new(‘d’) | Pointer.new(:double) |
character string (char *) | Pointer.new(‘*’) | Pointer.new(:string) |
pointer | Pointer.new(‘^’) | Pointer.new(:pointer) |
object | Pointer.new(‘@’) | Pointer.new(:object) Pointer.new(:id) |
class object (Class) | Pointer.new(‘#’) | Pointer.new(:class) |
boolean | Pointer.new(‘B’) | Pointer.new(:boolean) Pointer.new(:bool) |
method selector (SEL) | Pointer.new(‘:’) | Pointer.new(:selector) Pointer.new(:sel) |
Pointer クラスのメソッド
Pointer.new
Pointer クラスのインスタンスを作成して返します。
- new(type, size = 1) -> Pointer
- [PARAM] type:
- どのようなポインタ変数を作成するか指定します。
- [PARAM] size:
- ポインタ変数のサイズを指定します。
- [RETURN]
- 作成した Pointer のインスタンスを返します。
- [PARAM] type:
Pointer.new_with_type
Pointer.new の別名です。
Pointer.magic_cookie
即値を (void *) へキャストした Pointer のインスタンスを返します。
- magic_cookie(val) -> Pointer
- [PARAM] val:
- 数値を指定します。
- [RETURN]
- (void *) に即値をキャストした Pointer のインスタンスを返します。
- [PARAM] val:
OpenGL に関するチケット #1112 でこのメソッドが追加されました。
Pointer#type
どのような種類のポインタか確認するのに使用します。
- type -> String
- [RETURN]
- ポインタの種類を返します。
- [RETURN]
1 2 3 4 |
|
Pointer#cast!
ポインタの種類を変更します。
- cast!(type) -> self
- [PARAM] type:
- 変更先のポインタの種類を指定します。
- [RETURN]
- ポインタの種類を変更したオブジェクトを返します。
- [PARAM] type:
1 2 3 4 5 6 |
|
Pointer#[]
nth 番目の内容を取得します。
- self[nth]
- [PARAM] nth:
- 取得する内容の位置を指定します。
- [RETURN]
- nth 番目の内容を返します。
- [PARAM] nth:
Pointer#[]=
nth 番目の内容を val で置き換えます。
- self[nth] = val
- [PARAM] nth:
- 置き換える内容の位置を指定します。
- [PARAM] val:
- 置き換える内容を指定します。
- [RETURN]
- val を返します。
- [PARAM] nth:
Pointer#value
0 番目の内容を取得します。
- value
- [RETURN]
- 0 番目の内容を取得します。
- [RETURN]
1 2 3 4 5 |
|
Pointer#assign
0 番目の内容を val で置き換えます。
- assign(val)
- [PARAM] val:
- 置き換える内容を指定します。
- [RETURN]
- val を返します。
- [PARAM] val:
Pointer#+
指定した offset からの Pointer インスタンスを返します。
- self + offset -> Pointer
- [PARAM] offset:
- 取得する内容の位置を指定します。
- [RETURN]
- 指定した位置からの Pointer インスタンスを返します。
- [PARAM] offset:
1 2 3 4 5 6 7 8 9 10 11 |
|
Pointer#-
Pointer#+ と同じように、指定した offset からの Pointer インスタンスを返します。
- self - offset -> Pointer
- [PARAM] offset:
- 取得する内容の位置を指定します。
- [RETURN]
- 指定した位置からの Pointer インスタンスを返します。
- [PARAM] offset:
Pointer#to_object
TBD