From: "AMomchilov (Alexander Momchilov) via ruby-core" Date: 2023-06-05T04:44:41+00:00 Subject: [ruby-core:113762] [Ruby master Feature#19708] Support `attr_reader :foo?` Issue #19708 has been updated by AMomchilov (Alexander Momchilov). > > You can workaround this by using attr_reader to create the optimized method, alias_method to give it the > > nice active? name, and then remove_method to delete the original non-? name: > > There are many workarounds. I simply use the "def" variant. :P > > def age? > @age > end; alias age age? That's not equivalent. It's the "next best thing", but it creates a `VM_METHOD_TYPE_IVSEQ` method, not a more optimized `VM_METHOD_TYPE_IVAR`. > Are these two separate methods or not? Consider this: > > attr_reader :foobar > attr_reader :foobar? > > Both would query over @foobar, right? Yep. > But are these the same methods or different? e. g. when > someone undefines/removes them, is the other one removed or not? There's no ambiguity here, they're two different methods, that just happen to share an underlying instance variable, no different than if you had written them by hand. You can undef one, or the other, or both. ---------------------------------------- Feature #19708: Support `attr_reader :foo?` https://bugs.ruby-lang.org/issues/19708#change-103408 * Author: AMomchilov (Alexander Momchilov) * Status: Open * Priority: Normal ---------------------------------------- Creating reader methods with `attr_reader` is preferable over defining them by hand, not only because it's more convenient, but also because it hits a fast path in MRI (see `VM_METHOD_TYPE_IVAR`). Since local and instance variables can't end with `?`, you can't use `attr_reader` to define predicate-style methods for boolean values, like: ```ruby class Person attr_reader :name, :age, :active? # invalid attribute name `active?' (NameError) def initialize @name = "Bob" @age = 30 @active = true end end ``` It would be nice if `attr_reader` (and friends) could behave like: ```ruby def active? = @active ``` (`attr_writer` and `attr_accessor` couldn't do the same, since `def active?=(new_value)` isn't valid, so they'd probably stick with `def active=(new_value)`) -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/