From: "AMomchilov (Alexander Momchilov) via ruby-core" Date: 2023-06-22T00:42:58+00:00 Subject: [ruby-core:113991] [Ruby master Feature#19708] Support `attr_reader :foo?` Issue #19708 has been updated by AMomchilov (Alexander Momchilov). Hey Jean & Benoit, thanks for finding those prior discussions. I tried searching for them before posting, but the question mark makes it really hard to find anything relevant, haha I think the use case is clear: defining reader methods that are both fast (`VM_METHOD_TYPE_IVAR`) _and_ idiomatic (`#foo?` over `#is_foo`). Today you're forced to choose one or the other: * Either you get idomatic naming with `def foo? = @foo`, but a slower `VM_METHOD_TYPE_ISEQ` method, * Or you get a faster method with `attr_reader :is_foo`, but lose the idomatic naming. With the proposed change, you can get the best of both worlds. There's also the case for convenience: you no longer have to split your attribute readers into two groups: ```ruby class C attr_reader :a, :c, :d, :f # Group 1: non-predicate methods can use attr_reader def initialize # ... end # ... other stuff # Group 2: predicate methods need explicit `def`s def b? = @b def e? = @e end ``` > I think a PR/patch for this would help to make progress (it might not be trivial). I took a cursory look: I think it'll definitely be a challenge, but I think it's something to take on. Ideally, I'd like to first get some sort of tentative interest, to make sure I don't put effort into a PR that's dead-on-arrival :D ---------------------------------------- Feature #19708: Support `attr_reader :foo?` https://bugs.ruby-lang.org/issues/19708#change-103649 * 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/