From: dylan.smith@... Date: 2019-08-24T00:30:28+00:00 Subject: [ruby-core:94518] [Ruby master Feature#16123] Allow calling a private method with `self.` Issue #16123 has been updated by dylants (Dylan Thacker-Smith). Here is a script to help demonstrate the inconsistency, where `self.bar = 123` is allowed by `self.bar` is not. ```ruby class Foo def foo self.bar = 123 # allowed self.bar # raises end private attr_accessor :bar end Foo.new.foo ``` By attribute writer, I was just referring to an assignment method like the one defined by `attr_writer`, although the same applies to any assignment method like `def bar=(value); value; end`. The inconsistency is just more obvious when dealing with the pair of methods defined by `attr_accessor` if they are private because `self.` works with one of them but not the other as shown above. shevegen (Robert A. Heiler) wrote: > I may not understand this, but I assume you can get the value of any method via .send() and assign it to the local variable? Yes, it can be easily worked around, it just doesn't seem like it should be necessary to workaround this limitation. The point of `private` is to keep things from being accessible from other objects, which we know isn't the case when a call is made on `self.` directly. ---------------------------------------- Feature #16123: Allow calling a private method with `self.` https://bugs.ruby-lang.org/issues/16123#change-80954 * Author: dylants (Dylan Thacker-Smith) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- ## Problem There is an inconsistency between calling a private attribute writer being allowed with `self.value =` syntax and `self.value` not being allowed on a private attribute writer. Calling a private method in this way can be useful when trying to assign the return value of this private method to a local variable with the same name. ## Solution The attached patch handles this by compiling the calling into a function call by using the `VM_CALL_FCALL` flag, so it is as if the call were made without the `self.` prefix, except it won't be confused with local variables at the VM instruction level. It is also compiled like an assignment call, except I didn't use the `COMPILE_RECV` macro, since that would remove the `CHECK` macro usage around the `COMPILE` line. ---Files-------------------------------- 0001-Allow-calling-a-private-method-with-self.diff.txt (3.28 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: