すごくメモ帳

すごくほぼメモ帳ぐらいなブログ

Rubyの拡張ライブラリー入門シリーズ③ (アクセサ: rb_define_attr)

アクセサを定義する

アクセサとは

アクセサとは、インスタンス変数に対して読み書きするものです。

def hoge
    @hoge
end

クラス内で上のように定義すると、インスタンス変数が示すものを読み込むことができます。

def hoge= val
    @hoge = val
end

とクラスで定義すると、インスタンス変数を定義することができます。

同じようなものをいちいち定義するのは面倒なので、1行で定義できるようにメソッドが用意されています。

読み 書き 読み書き
attr_reader attr_writer attr_accessor

たとえば、上にある2つのメソッドの定義はattr_accssorメソッドを代わりに用いて次のように定義することができます。

attr_accssor :hoge

Ruby

C言語

RubyとCで書いてみる

class Hoge
    attr_accessor :a
    attr_writer :w
    attr_reader :r
end

↑と↓が同じように動く。

// hoge.c
#include <ruby.h>

VALUE rb_cHoge;

void Init_Hoge(void){
    rb_cHoge = rb_define_class("Hoge", rb_cObject);
    rb_define_attr(rb_cHoge, "a", 1, 1);
    rb_define_attr(rb_cHoge, "r", 1, 0);
    rb_define_attr(rb_cHoge, "w", 0, 1);
}

make

ruby -e "require 'mkmf'; create_makefile 'Hoge'" & make

実行してみる

# irb
require "./Hoge"
hoge = Hoge.new

hoge.a #=> nil
hoge.a = 1
hoge.a #=> 1

hoge.r #=> nil
hoge.r = 1 # NoMethodError

hoge.w # NoMethodError
hoge.w = 1