在对 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