From 8e637bdd83505e8c1723f87a8d267e00ee209787 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sun, 19 May 2019 22:15:27 +0900 Subject: Should clarify the role of `mruby-kernel-ext` and `mruby-object-ext`; close #4449 The former should contain function like methods, and the latter should contain methods shared by all objects. --- mrbgems/mruby-object-ext/mrblib/object.rb | 16 +++++++++++++++- mrbgems/mruby-object-ext/src/object.c | 17 +++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) (limited to 'mrbgems/mruby-object-ext') diff --git a/mrbgems/mruby-object-ext/mrblib/object.rb b/mrbgems/mruby-object-ext/mrblib/object.rb index 581156cb0..f014df469 100644 --- a/mrbgems/mruby-object-ext/mrblib/object.rb +++ b/mrbgems/mruby-object-ext/mrblib/object.rb @@ -1,4 +1,18 @@ -class Object +module Kernel + # call-seq: + # obj.yield_self {|_obj|...} -> an_object + # obj.then {|_obj|...} -> an_object + # + # Yields obj and returns the result. + # + # 'my string'.yield_self {|s|s.upcase} #=> "MY STRING" + # + def yield_self(&block) + return to_enum :yield_self unless block + block.call(self) + end + alias then yield_self + ## # call-seq: # obj.tap{|x|...} -> obj diff --git a/mrbgems/mruby-object-ext/src/object.c b/mrbgems/mruby-object-ext/src/object.c index b076b3ec0..dce97132c 100644 --- a/mrbgems/mruby-object-ext/src/object.c +++ b/mrbgems/mruby-object-ext/src/object.c @@ -44,6 +44,22 @@ nil_to_i(mrb_state *mrb, mrb_value obj) return mrb_fixnum_value(0); } +/* + * call-seq: + * obj.itself -> an_object + * + * Returns obj. + * + * string = 'my string' #=> "my string" + * string.itself.object_id == string.object_id #=> true + * + */ +static mrb_value +mrb_f_itself(mrb_state *mrb, mrb_value self) +{ + return self; +} + /* * call-seq: * obj.instance_exec(arg...) {|var...| block } -> obj @@ -102,6 +118,7 @@ mrb_mruby_object_ext_gem_init(mrb_state* mrb) mrb_define_method(mrb, n, "to_f", nil_to_f, MRB_ARGS_NONE()); #endif mrb_define_method(mrb, n, "to_i", nil_to_i, MRB_ARGS_NONE()); + mrb_define_module_function(mrb, mrb->kernel_module, "itself", mrb_f_itself, MRB_ARGS_NONE()); mrb_define_method(mrb, mrb->kernel_module, "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK()); } -- cgit v1.2.3