Skip to content

Instantly share code, notes, and snippets.

@benolee
Last active December 11, 2015 00:19
Show Gist options
  • Select an option

  • Save benolee/4515614 to your computer and use it in GitHub Desktop.

Select an option

Save benolee/4515614 to your computer and use it in GitHub Desktop.
get and set a secret instance variable

first, make the Makefile

$ ruby extconf.rb
creating Makefile

next, build the extension

$ make
compiling wat.c
linking shared-object wat.so

to load the extension, just require 'wat'

require './wat'
#=> true

a module named Wat will be available for including/extending

include Wat
set_secret_ivar "hola"
get_secret_ivar
#=> "hola"

there are also tests

$ ruby wat_test.rb 
Run options: --seed 30532

# Running tests:

...

Finished tests in 0.001754s, 1710.6552 tests/s, 1710.6552 assertions/s.

3 tests, 3 assertions, 0 failures, 0 errors, 0 skips
require 'mkmf'
create_makefile 'wat'
#include <ruby.h>
VALUE
wat_get_secret_ivar(VALUE receiver, VALUE ivar)
{
// VALUE rb_iv_get(VALUE, const char*)
return rb_iv_get(receiver, "");
}
VALUE
wat_set_secret_ivar(VALUE receiver, VALUE value)
{
// VALUE rb_iv_set(VALUE, const char*, VALUE)
return rb_iv_set(receiver, "", value);
}
void
Init_wat(void)
{
// VALUE rb_define_module(const char*);
VALUE mWat = rb_define_module("Wat");
// void rb_define_method(VALUE,const char*,VALUE(*)(ANYARGS),int);
rb_define_method(mWat, "get_secret_ivar", wat_get_secret_ivar, 0);
rb_define_method(mWat, "set_secret_ivar", wat_set_secret_ivar, 1);
}
require './wat'
require 'minitest/autorun'
class WatTest < MiniTest::Unit::TestCase
def setup
@obj = Object.new
@obj.extend(Wat)
end
def test_ivar_is_initially_nil
assert_nil @obj.get_secret_ivar
end
def test_ivar_set_and_get
str = "zomg!"
@obj.set_secret_ivar str
assert_equal @obj.get_secret_ivar, str
end
def test_ivar_is_invisible
assert @obj.instance_variables.size == 0
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment