summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-01 07:50:53 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-01 07:50:53 +0000
commitcec0668209483a3f233574211c4b8fbd3d1d64b7 (patch)
treea52f0e7e2806d023f52a05d7e35032dc04eed1b2
parentdabaaafd9f1932c103f489ac59a2f09ae5e02d09 (diff)
object.c: Kernel#yield_self
* object.c (rb_obj_yield_self): new method which yields the receiver and returns the result. [ruby-core:46320] [Feature #6721] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58528 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--NEWS4
-rw-r--r--object.c18
-rw-r--r--test/ruby/test_object.rb8
3 files changed, 30 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 399f1fe010..29033dd93f 100644
--- a/NEWS
+++ b/NEWS
@@ -40,6 +40,10 @@ with all sufficient information, see the ChangeLog file or Redmine
* exception message "stream closed" is changed [Bug #13405]
+* Kernel
+
+ * Kernel#yield_self [Feature #6721]
+
* Numeric
* Numerical comparison operators (<,<=,>=,>) no longer rescue exceptions
diff --git a/object.c b/object.c
index 92cea14514..184a72f1fa 100644
--- a/object.c
+++ b/object.c
@@ -497,6 +497,23 @@ rb_obj_itself(VALUE obj)
return obj;
}
+/*
+ * call-seq:
+ * obj.yield_self {|_obj|...} -> an_object
+ *
+ * Yields <i>obj</i> and returns the result.
+ *
+ * 'my string'.yield_self {|s|s.upcase} #=> "MY STRING"
+ *
+ */
+
+static VALUE
+rb_obj_yield_self(VALUE obj)
+{
+ RETURN_ENUMERATOR(obj, 0, 0);
+ return rb_yield_values2(1, &obj);
+}
+
/* :nodoc: */
VALUE
rb_obj_init_copy(VALUE obj, VALUE orig)
@@ -3507,6 +3524,7 @@ InitVM_Object(void)
rb_define_method(rb_mKernel, "clone", rb_obj_clone2, -1);
rb_define_method(rb_mKernel, "dup", rb_obj_dup, 0);
rb_define_method(rb_mKernel, "itself", rb_obj_itself, 0);
+ rb_define_method(rb_mKernel, "yield_self", rb_obj_yield_self, 0);
rb_define_method(rb_mKernel, "initialize_copy", rb_obj_init_copy, 1);
rb_define_method(rb_mKernel, "initialize_dup", rb_obj_init_dup_clone, 1);
rb_define_method(rb_mKernel, "initialize_clone", rb_obj_init_dup_clone, 1);
diff --git a/test/ruby/test_object.rb b/test/ruby/test_object.rb
index d93d5594a7..6a1a82546a 100644
--- a/test/ruby/test_object.rb
+++ b/test/ruby/test_object.rb
@@ -18,6 +18,14 @@ class TestObject < Test::Unit::TestCase
assert_same(object, object.itself, feature6373)
end
+ def test_yield_self
+ feature = '[ruby-core:46320] [Feature #6721]'
+ object = Object.new
+ assert_same(self, object.yield_self {self}, feature)
+ assert_same(object, object.yield_self {|x| break x}, feature)
+ assert_instance_of(Enumerator, object.yield_self)
+ end
+
def test_dup
assert_equal 1, 1.dup
assert_equal true, true.dup