📄 01 - using a c library from ruby.rb
字号:
#include "stdio.h"#include "ruby.h"static VALUE rb_mStdio;static VALUE rb_cStdioFile;struct file { FILE *fhandle;};static VALUEfile_allocate(VALUE klass){ struct file *f = malloc(sizeof(*f)); f->fhandle = NULL; return Data_Wrap_Struct(klass, file_mark, file_free, f);}static void file_mark(struct file *f){}static voidfile_free(struct file *f){ fclose(f->fhandle); free(f);}#---static VALUEfile_open(VALUE object, VALUE fname){ struct file *f; Data_Get_Struct(object, struct file, f); f->fhandle = fopen(RSTRING(fname)->ptr, "r"); return Qnil;}#---static VALUEfile_readbyte(VALUE object){ char buffer[2] = { 0, 0 }; struct file *f; Data_Get_Struct(object, struct file, f); if (! f->fhandle) rb_raise(rb_eRuntimeError, "Attempt to read from closed file"); fread(buffer, 1, 1, f->fhandle); return rb_str_new2(buffer);}#---voidInit_stdio(){ rb_mStdio = rb_define_module("Stdio"); rb_cStdioFile = rb_define_class_under(rb_mStdio, "File", rb_cObject); rb_define_alloc_func(rb_cStdioFile, file_allocate); rb_define_method(rb_cStdioFile, "open", file_open, 1); rb_define_method(rb_cStdioFile, "readbyte", file_readbyte, 0);}#---# extconf.rbrequire 'mkmf'dir_config("stdio")create_makefile("stdio")#---open('foo.txt', 'w') { |f| f << 'foo' }require 'stdio'f = Stdio::File.newf.open('foo.txt')f.readbyte # => "f"f.readbyte # => "o"f.readbyte # => "o"#---
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -