Ruby と C を調査した結果、例外クラスがmesg
. これは . で始まらないため、標準の Ruby ランタイムではアクセスできません@
。
接頭辞が付いていないインスタンス変数を取得および設定できる Ruby 拡張機能を追加することができます@
。これがどれほど危険なのか、私にはわかりません。
C モジュール:
#include "ruby.h"
static VALUE rb_mIvar;
static VALUE rb_ivar_iv_get(VALUE self, VALUE key) {
return rb_ivar_get(self, rb_to_id(key));
}
static VALUE rb_ivar_iv_set(VALUE self, VALUE key, VALUE value) {
return rb_ivar_set(self, rb_to_id(key), value);
}
void Init_ivar() {
rb_mIvar = rb_define_module("Ivar");
rb_define_method(rb_mIvar, "ivar_get", rb_ivar_iv_get, 1);
rb_define_method(rb_mIvar, "ivar_set", rb_ivar_iv_set, 2);
}
ルビーの使い方:
$:.unshift('.')
require 'ivar'
Object.send(:include, Ivar)
e = StandardError.new("foo")
puts "Error message is: #{e.message}" # => e.message is "foo"
e.ivar_set(:mesg, "bar")
puts "Error message is: #{e.message}" # => e.message is now "bar"
私が調査と実験に使用した完全なコードを含むこの要点を参照してください: https://gist.github.com/adamhunter/5041075