diff options
author | Dylan Thacker-Smith <[email protected]> | 2019-07-02 15:06:54 +0100 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2019-09-20 02:20:59 +0900 |
commit | 7fbd2f7cc247ee66e877ab3c88f0274834c6b6c7 () | |
tree | 1d03cfc0cba9aabb542306f7f1f685dfb636f0c1 | |
parent | 17a13663998a98ff75fcc838d1cea95c879fbb88 (diff) |
Allow calling a private method with `self.`
This makes it consistent with calling private attribute assignment methods, which currently is allowed (e.g. `self.value =`). Calling a private method in this way can be useful when trying to assign the return value to a local variable with the same name. [Feature #11297] [Feature #16123]
Notes: Merged: https://.com/ruby/ruby/pull/2474
-rw-r--r-- | compile.c | 4 | ||||
-rw-r--r-- | spec/ruby/language/send_spec.rb | 2 | ||||
-rw-r--r-- | test/ruby/test_method.rb | 2 | ||||
-rw-r--r-- | test/ruby/test_module.rb | 3 | ||||
-rw-r--r-- | test/ruby/test_refinement.rb | 2 |
5 files changed, 9 insertions, 4 deletions
@@ -6773,6 +6773,10 @@ compile_call(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, in iseq_block_param_id_p(iseq, node->nd_recv->nd_vid, &idx, &level)) { ADD_INSN2(recv, nd_line(node->nd_recv), getblockparamproxy, INT2FIX(idx + VM_ENV_DATA_SIZE - 1), INT2FIX(level)); } else { CHECK(COMPILE(recv, "recv", node->nd_recv)); } @@ -260,7 +260,7 @@ end describe "Invoking a private getter method" do it "does not permit self as a receiver" do receiver = LangSendSpecs::PrivateGetter.new - -> { receiver.call_self_foo }.should raise_error(NoMethodError) -> { receiver.call_self_foo_or_equals(6) }.should raise_error(NoMethodError) end end @@ -673,7 +673,7 @@ class TestMethod < Test::Unit::TestCase assert_nothing_raised { mv3 } assert_nothing_raised { self.mv1 } - assert_raise(NoMethodError) { self.mv2 } assert_nothing_raised { self.mv3 } v = Visibility.new @@ -2479,7 +2479,8 @@ class TestModule < Test::Unit::TestCase assert_include(methods, :#{method}, ":#{method} should be private") assert_raise_with_message(NoMethodError, "private method `#{method}' called for main:Object") { - self.#{method} } } end @@ -538,7 +538,7 @@ class TestRefinement < Test::Unit::TestCase def test_main_using_is_private assert_raise(NoMethodError) do - eval("self.using Module.new", Sandbox::BINDING) end end |