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
- https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_accessor.html
- https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_reader.html
- https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_writer.html
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