[ruby-core:117932] [Ruby master Feature#20498] Negated method calls
From:
duerst via ruby-core <ruby-core@...>
Date:
2024-05-20 03:23:04 UTC
List:
ruby-core #117932
Issue #20498 has been updated by duerst (Martin D=FCrst). I think defining an explicit method for this purpose (on `Object`, I guess)= would be better, because it wouldn't add complications to the syntax. The = name could be `not` or `invert` or `negate or some such. Your result would = look like: ``` must_create_user =3D User.where(somelong: :condition, even_more: "thing").e= xists.not ``` BTW, different languages use different places (start, middle, end, several = places) for the negation. (Japanese puts it at the end.) ---------------------------------------- Feature #20498: Negated method calls https://bugs.ruby-lang.org/issues/20498#change-108344 * Author: MaxLap (Maxime Lapointe) * Status: Open ---------------------------------------- I want to propose the following syntax: `foo.!bar`. I know it's already val= id syntax, but please read on for details. When someone write a somewhat long line of code that is negated, the main w= ay I've seen of doing it is: ``` must_create_user =3D !User.where(somelong: :condition, even_more: "thing").= exists? ``` I personally highly dislike it, as I must keep the "not" in the back of my = mind as I read the line. When quickly reading a line like this, it's super = easy to misread and understand the opposite result. The current ways around this I can think of are:=20 * rename the variable (can be annoying) * Use `unless` (only possible when in a condition; some people, like me, ha= ve a hard time grapsping a `unless`) * use a `.!`in the end (`foo.exists?.!`), I've never seen that and it looks= ugly to me (this is subjective). * create a new method name with the negated meaning (not always possible) My proposal would look like this: ``` must_create_user =3D User.where(somelong: :condition, even_more: "thing").!= exists? ``` You cannot forget the bang that you saw 15 words ago, it's right there. It also basically reads as English: "user where ... doesn't exists". The main argument against this I can think of is that it's technically alre= ady a valid syntax. I believe it's frowned upon to override the bang operat= or and I'm not aware of places where it is overridden to with also having a= parameter. I made a prototype in RubyNext, which you can try here: https://ruby-next.g= ithub.io/#gist:0e133bf6f27f2437193dc034d58083dc --=20 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-c= ore.ml.ruby-lang.org/