[#116016] [Ruby master Bug#20150] Memory leak in grapheme clusters — "peterzhu2118 (Peter Zhu) via ruby-core" <ruby-core@...>
Issue #20150 has been reported by peterzhu2118 (Peter Zhu).
7 messages
2024/01/04
[#116382] [Ruby master Feature#20205] Enable `frozen_string_literal` by default — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>
Issue #20205 has been reported by byroot (Jean Boussier).
77 messages
2024/01/23
[ruby-core:116122] [Ruby master Feature#18948] Add `with_private_method` option to `private_constant`
From:
"okuramasafumi (Masafumi OKURA) via ruby-core" <ruby-core@...>
Date:
2024-01-09 16:01:24 UTC
List:
ruby-core #116122
Issue #18948 has been updated by okuramasafumi (Masafumi OKURA).
I'm convinced by Jeremy's argument. Please someone close this issue.
----------------------------------------
Feature #18948: Add `with_private_method` option to `private_constant`
https://bugs.ruby-lang.org/issues/18948#change-106123
* Author: okuramasafumi (Masafumi OKURA)
* Status: Open
* Priority: Normal
----------------------------------------
## Problem
I have the following code:
```ruby
module M1
CONST = 'CONST'.freeze
end
module M2
def self.included(base)
base.include M1
base.include InstanceMethods
end
module InstanceMethods
def const?(value)
M1::CONST == value
end
end
end
class C
include M2
end
C.new.const?('CONST') # => true
```
`M2` module "inherits" `M1` module using `included` hook. This code works, but I prefer making constants private. However, when I add `private_constant :CONST` to `M1` then the code doesn't work anymore since we cannot refer `M1::CONST`.
## Workaround
One way to solve this is to define method that just returns the private constant.
```ruby
# Refined version of M1 with `const` method
module M1
CONST = 'CONST'.freeze
private_constant :CONST
private
def const
CONST
end
end
# Refined version of M2, using `const` method inherited from M1
module M2
def self.included(base)
base.include M1
base.include InstanceMethods
end
module InstanceMethods
def const?(value)
const == value
end
end
end
```
This works anyway, but defining private method for every private constant could be cumbersome.
## Solution
So my suggestion here is to add `with_private_method` option to `private_constant` method. The auto-generated private method has the same name as the given constant and just returns it. So we can do the following:
```ruby
module M1
CONST = 'CONST'.freeze
private_constant :CONST, with_private_method: true
end
```
Now we can access `CONST` with `const` method. This makes is possible to refer private constants through private methods more easily, that helps some code like my example.
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- [email protected]
To unsubscribe send an email to [email protected]
ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/