mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Add Symbol#to_proc, Symbol.all_symbols
This commit is contained in:
@@ -47,6 +47,9 @@ MRuby::Build.new do |conf|
|
||||
# Use extensional Proc class
|
||||
conf.gem "#{root}/mrbgems/mruby-proc-ext"
|
||||
|
||||
# Use extensional Symbol class
|
||||
conf.gem "#{root}/mrbgems/mruby-symbol-ext"
|
||||
|
||||
# Use Random class
|
||||
conf.gem "#{root}/mrbgems/mruby-random"
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
MRuby::Gem::Specification.new('mruby-symbol-ext') do |spec|
|
||||
spec.license = 'MIT'
|
||||
spec.authors = 'mruby developers'
|
||||
end
|
||||
@@ -0,0 +1,9 @@
|
||||
class Symbol
|
||||
|
||||
def to_proc
|
||||
Proc.new do |obj, *args|
|
||||
obj.send(self, *args)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,55 @@
|
||||
#include "mruby.h"
|
||||
#include "mruby/khash.h"
|
||||
#include "mruby/array.h"
|
||||
|
||||
typedef struct symbol_name {
|
||||
size_t len;
|
||||
const char *name;
|
||||
} symbol_name;
|
||||
|
||||
KHASH_DECLARE(n2s, symbol_name, mrb_sym, 1)
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* Symbol.all_symbols => array
|
||||
*
|
||||
* Returns an array of all the symbols currently in Ruby's symbol
|
||||
* table.
|
||||
*
|
||||
* Symbol.all_symbols.size #=> 903
|
||||
* Symbol.all_symbols[1,20] #=> [:floor, :ARGV, :Binding, :symlink,
|
||||
* :chown, :EOFError, :$;, :String,
|
||||
* :LOCK_SH, :"setuid?", :$<,
|
||||
* :default_proc, :compact, :extend,
|
||||
* :Tms, :getwd, :$=, :ThreadGroup,
|
||||
* :wait2, :$>]
|
||||
*/
|
||||
static mrb_value
|
||||
mrb_sym_all_symbols(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
khiter_t k;
|
||||
mrb_sym sym;
|
||||
khash_t(n2s) *h = mrb->name2sym;
|
||||
mrb_value ary = mrb_ary_new_capa(mrb, kh_size(h));
|
||||
|
||||
for (k = kh_begin(h); k != kh_end(h); k++) {
|
||||
if (kh_exist(h, k)) {
|
||||
sym = kh_value(h, k);
|
||||
mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
|
||||
}
|
||||
}
|
||||
|
||||
return ary;
|
||||
}
|
||||
|
||||
void
|
||||
mrb_mruby_symbol_ext_gem_init(mrb_state* mrb)
|
||||
{
|
||||
struct RClass *s = mrb->symbol_class;
|
||||
mrb_define_class_method(mrb, s, "all_symbols", mrb_sym_all_symbols, ARGS_NONE());
|
||||
}
|
||||
|
||||
void
|
||||
mrb_mruby_symbol_ext_gem_final(mrb_state* mrb)
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
##
|
||||
# Symbol(Ext) Test
|
||||
|
||||
assert('Symbol#to_proc') do
|
||||
assert_equal :abs.to_proc[-5], 5
|
||||
end
|
||||
|
||||
assert('Symbol.all_symbols') do
|
||||
foo = [:__symbol_test_1, :__symbol_test_2, :__symbol_test_3].sort
|
||||
symbols = Symbol.all_symbols.select{|sym|sym.to_s.include? '__symbol_test'}.sort
|
||||
assert_equal symbols, foo
|
||||
end
|
||||
Reference in New Issue
Block a user