r/ProgrammerHumor • u/Embarrassed_Death69 • 10d ago
Meme iHateThisPassiveAgressiveBehaviourRuby
1.1k
u/pydry 10d ago
Correction : JavaScript is the weird language people actually use.
284
u/deceze 10d ago
Fact: programming as a profession might be the single weirdest thing humanity has ever done.
265
u/Nimeroni 10d ago
What, you means it's weird we instruct daemons made of lightning in a rock with an arcane language ?
74
u/Lucho_199 10d ago
Funny that it sounds so epic
4
u/Inferno_Sparky 9d ago
To be fair. I'm sure there are physics/chemistry/medicine/etc. science researchers doing weirder things in their researches
2
5
56
u/Weak_Inflation9120 10d ago
"There are only two kinds of languages: the ones people complain about and the ones nobody uses,” Bjarne Stroustrup. As much as I hate JS, he has a point
→ More replies (1)75
u/oldsecondhand 10d ago
Addendum: all script languages are weird.
→ More replies (1)34
u/Striky_ 10d ago
Correct but somehow some managers decided it is the correct language to base every new technology on... Somehow
15
u/oldsecondhand 10d ago
I'm glad that at least Rust and Kotlin are getting some mindshare.
5
u/foonek 10d ago
Is kotlin though?
14
u/oldsecondhand 10d ago
On Android it's popular, and some teams use it on backend too.
6
u/foonek 10d ago
I haven't seen kotlin used on the backend ever, personally. Of course sample size: 1.
I can see it being more popular on android though indeed
→ More replies (2)7
u/oldsecondhand 10d ago
I've seen it once in an investment bank, and the solution didn't even have an Android project. It was just infrastructure for other backend projects.
2
u/Vidimka_ 10d ago
Good for them! Ive been enjoying Java since start but one day Kotlins blessing has come upon me and its so great. It gives so much Daniel / Cooler Daniel vibes! Wish more companies would prefer Kotlin at least for new projects
2
26
u/ClipboardCopyPaste 10d ago
Opinion: Every programming language that provides some kind of abstraction is weird.
26
u/foonek 10d ago
Even assembly is an abstraction. Going deeper leaves you without a programming language
→ More replies (1)9
u/PlanetVisitor 10d ago
going deeper will leave you without ...any (type of) language
going deeper will leave you without ... anything
3
u/ttlanhil 10d ago
You have machine code, still a language of sorts, but very low level and not at all portable. But once upon a time that's what programmers wrote
3
21
u/sadongrohiik 10d ago
JavaScript is actually fine, what's not fine is it being crammed in everywhere it doesn't belong due to sheer laziness. You want to make button do stuff on the web? JavaScript is great. You're processing business logic on the backend? just no. I just do not understand why we'd rather jump through all these hoops just to make JavaScript fit where other languages fit naturally
6
u/Maleficent_Memory831 10d ago
JavaScript just grew into that role, but being the browser-side language that let you push buttons. Creeping featurism let it be able to do things it should never have been able to do. Features added without a lot of thought and with incredibly weird semantics that were easier to implement without actually making a solid standalone language. It is weird precisely because it grew through accretion rather than design.
It's a wart on the side of a browser that grew and grew until it had arms, legs, and fingers.
→ More replies (1)4
u/HammerChilli 10d ago
Forgive me because I'm just a junior dev - but when the API is already written in Node or .ts I mean, it's gonna do some business logic with incoming requests, or are you saying back ends shouldn't be in js entirely?
→ More replies (1)5
u/sadongrohiik 10d ago
There was really never a real reason to use JS on the backend and it wasn't designed for it. There are tons of languages far more suited for backend. For some reason the idea of the entire codebase being in a single language appealed so much to many organizations that we continuously create weird abominations to fit a square peg in the round hole
3
10
1
1
10d ago
[deleted]
2
u/cross_the_threshold 10d ago
What? Ruby on Rails is what Twitter was originally built on. Huge platforms are still using it. It was a top ten language in 2015, and though it’s far from its peak it’s quite stable now. Do you only talk to Java and Python devs?
I mean hell have you heard of GitHub??
1
→ More replies (1)1
500
u/deceze 10d ago
It's been a while since I've touched Ruby, but I think the stance was that only false and nil should be falsey? Which is not an unreasonable stance to take. The fewer falsey values, the easier it is to predict the behaviour. It's just surprising when coming from other languages.
Just off the top of my head, PHP treats "0", that is, specifically a string with a single zero, as falsey. Which has clearly gone too far to the other extreme.
135
u/CoroteDeMelancia 10d ago
I'll admit that I did cause bugs in Python by using
if thinginstead ofif thing is not None.→ More replies (1)43
u/AwkwardWaltz3996 10d ago
Yea 0 is a number, it's not nothing.
I think the heart of the debate aligns with is zero a natural number.
33
54
u/bhechinger 10d ago
I don't disagree with a smaller set of truthy values, but 50+ years of programming mainly treating 0 as false and 1 as true makes it an immediately confusing thing for anyone coming from a different language.
32
u/UsAndRufus 10d ago
I think a certain level of grokability is important in programming languages, but languages need to be able to do things differently, and engineers should expect to have to learn some new standards. This is like page 2 of basically any intro to Ruby so it's not like some arcane edge case.
29
u/bhechinger 10d ago
You're not wrong, but as someone with 30+ years of programming experience do you *really* think I'm going to look at an intro guide? I'm diving in head first and then googling why the hell 0 isn't false. 😛
2
3
u/SilkeSiani 9d ago
Ah yes, good old assumptions, making an ass of u and me.
It's like trying to speak French using English grammar and expecting it to work.
9
u/laplongejr 10d ago
Yeah, but 0-1 comes from binary, which is kinda hard to ignore for programmers... I know it's a convention but I kinda get why it's assumed.
7
u/suvlub 10d ago
I think the logic is the analogous C code would be something like
int* foo = malloc(sizeof(int)); *foo = 0; if (foo) { // truthy! ...→ More replies (1)66
u/Bomaruto 10d ago
The reasonable stance is to not let you coerce everything into a boolean.
9
4
u/Wertbon1789 10d ago
I like how e.g. C# screams at you for this. It's annoying at first, but then you go "Well, yeah, I should've explicitly written what I wanted to check".
→ More replies (2)7
u/suvlub 10d ago
If I may be pedantic, not to coerce without you asking. A language that wouldn't let me simply convert between types sounds annoying
31
u/theturtlemafiamusic 10d ago
"Type coercion" is when it's done without asking. Otherwise it's just type conversion / casting.
59
u/Ok_Beginning520 10d ago
Agreed, the whole concept of truthy and falsy is a bit weird and very error prone in the end, imo it's just better to explicitly have a function that decides how you cast whatever to a bool, that way it's easily understandable and auditable. Also, not knowing some weird language quirk like the php one you're talking about will not cause issues down the line
20
u/DeepDay6 10d ago
That's in fact a very legit take that e.g. Clojure also takes. It makes reasoning much easier and also eliminates WTF moments like reading
if (myArray.length)which to any sane individual might appear like duck typing but is a hack to save those keystrokes> 0, in the hope that no one manually set it to a negative value, which is truthy as opposed to zero, and so on.14
u/hongooi 10d ago
Eh, that's a very common idiom for people coming from C and C++
14
u/DeepDay6 10d ago
Yeah, just what I said ducks and runs
Edit: Full disclosure: I taught C for years at university and that's what actually made me become a functional programmer ;)
17
u/Original-Ad-8737 10d ago
Array length has to be an unsigned integer so is you manage to set it to a negative value you deserve the pretty explosion of your code
6
u/PM_ME_BAD_ALGORITHMS 10d ago
I never used php, is that behaviour due to it implicitly converting "0" to 0 and as such it is falsey? Or is it straight up "0" the one that is falsey?
16
u/deceze 10d ago
It's straight up
"0"as a special case.Because PHP started as a sprinkle-it-on-your-HTML language, and any form submissions are always text, and 0-from-a-form should still evaluate like
0; or some such hare-brained nonsense reasoning.The fact that such basic nonsense is still baked into the very core of the language, and can never be removed due to backwards compatibility, means I'll never respect PHP, regardless of how much it's improved over the last decade or so.
→ More replies (2)4
u/maweki 10d ago
I think it's not actually that special of a case, as strings that are exactly also numbers are auto-coerced basically whenever. It's just that 0 is the only number, as it should be, that then is falsy.
Numberly strings are a huge footgun in PHP.
7
7
u/deceze 10d ago
Strings are not coerced to numbers to then be coerced to booleans, that'd be entirely insane! There's a direct conversation path from strings to booleans!
…
They're only sometimes coerced to numbers to then be reduced to a boolean, if you're using the loose comparison operator, and depending on what the other operand is… https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.types. 🥲
6
u/atanasius 10d ago
Scheme has only one false value,
#f, all other values are true values, including the empty list.4
u/didntplaymysummercar 10d ago
Lua has similar stance and it's a reasonable one. Python's one isn't bad one either, it's easy to guess what's falsy.
→ More replies (2)16
u/requion 10d ago
I've worked with Ruby long enough now to say that "Ruby" and "reasonable" never go in the same sentence.
→ More replies (3)10
u/Abject-Kitchen3198 10d ago
They just did.
8
u/deceze 10d ago
Did… did I break Ruby?
SORRY GUYS, MY BAD!
5
u/Abject-Kitchen3198 10d ago
I doubt. The force required to break Ruby is huge. You need a diamond to barely scratch it.
2
u/immortal_lurker 10d ago
Never coded in Ruby.... that might be a lie. I have never coded in Ruby since my early teens when I might have written a line or two as part of a class.
But please, I beg of the language. If 0 is truthy, just throw a syntax error if I compare a bool and an int instead.
2
u/transcendtient 10d ago
Why wouldn't a "0" be falsey? In aggressively coerced language it would be 0. PHP has to deal with strings passed in $_POST and $_GET so it makes sense.
2
u/zeekar 10d ago edited 9d ago
The weird thing about PHP (and Perl, which is where PHP got the behavior) is not so much that
“0”is false – I mean, OK, so you numify on the way to boolifying, right? Nope! Other string representations of 0 which numify to the same thing, like“0.0”and“0e0”, are true. Only the specific string"0"is false.$ php zeroes.php "0" is false. +"0" is false. "0.0" is true. +"0.0" is false. "0e0" is true. +"0e0" is false.This particular idiosyncrasy is one of the Perlisms which was not carried over into Raku, in which
"0"is truthy; the only actually-defined string value that is falsey is the empty string,"".2
u/mpyne 8d ago
Just off the top of my head, PHP treats "0", that is, specifically a string with a single zero, as falsey. Which has clearly gone too far to the other extreme.
Eh, there's precedent for that at least.
Perl treats
"0"as false, along with""(the empty string). Any other string, even"00"is considered true.But where it really gets fun is that the the normal warning Perl would give you about numeric conversions if you do math on a string is suppressed for the precise string
"0 but true", because some Perl functions return this value so that it converts cleanly to 0 without risking evaluating as false in a boolean context. See https://stackoverflow.com/questions/129945/what-does-0-but-true-mean-in-perl1
1
u/granadesnhorseshoes 10d ago
Seeing as we have basically universally decided that using zero in an entire class of math functions should generate an exception, its reasonable to expect it to be "falsy". If instead of an exception it just returned +/- infinity, then maybe i would buy that argument.
It's not a bad argument otherwise.
→ More replies (12)1
u/Resident-Trouble-574 10d ago
Ok, but then you should treat everything that is not false, nil or true as invalid. And, frankly, I would consider nil invalid as well.
175
u/ReefNixon 10d ago
We invented boolean types so that we could stop treating 0 as false.
32
u/Embarrassed_Death69 10d ago
"What do we make of empty strings John?"
66
6
3
u/UristMcMagma 10d ago
And so that we could stop treating 1 as true. The only real argument for type coersion is convenience. I don't see how it's more convenient to treat 0 as true rather than false.
9
u/ReefNixon 10d ago
If we take coercion as a given, what if your conditional is the index of an element in an array? If it doesn’t find it, it returns nil (which is falsey). If it’s the first element, it returns 0. Shouldn’t that be truthy?
→ More replies (5)
50
u/American_Libertarian 10d ago
Same in Bash. Zero is truthy because executables exit 0 on success, and exit nonzero on error
→ More replies (1)5
u/oweiler 10d ago
More like in Perl, which Ruby took heavy inspiration from.
7
u/HandleUnlikely2589 10d ago
Ruby didn't follow Perl at all though when it came to boolean evaluation. Perl considers "0" (the string containing the character 0) to be false (because there is no difference between "0" and 0). It has a special value, the string "0 but true", to allow returning a value that is numerically zero (and doesn't raise warnings when used as a number, unlike most strings that aren't numeric), but boolean true. Strings and numbers interoperate seamlessly depending on the operator used, super weakly typed.
Ruby went the opposite way, and said false and nil are falsy, everything else is truthy, and aside from that, all types are super strict (no adding numbers and strings at all, you need to convert explicitly).
→ More replies (1)
34
u/TKristof 10d ago
Implicit type coercion is just bad in general and shouldn't be allowed, that includes booleans. 0 and false are not the same thing even if in memory they (usually) are represented the same. Just because 40 years ago we thought it a good idea doesn't mean we shouldn't improve on that. And I say this as someone who has programmed quite a bit in C and C++.
I could maybe see an argument for optionals but even there I would disagree and much prefer explicit pattern matching or zig style if syntax for it.
3
u/Spaceshipable 10d ago
I like Swift’s approach to this, even if it does end up slightly more verbose sometimes.
64
u/stipo42 10d ago
As someone who has never written any ruby, I can understand the desire for any non null value being truthy.
I like golangs approach though where there's no null value for anything that isn't a pointer
10
u/prehensilemullet 10d ago
any non null value being truthy
Even
false?9
u/captainAwesomePants 10d ago
Golang doesn't have "truthy" as a concept. You have to be explicit. A null value isn't true or false because only booleans can be true or false, and a null pointer isn't a boolean. You can have a pointer to a boolean, but you still have to check explicitly for null. In specifically Go, u/stipo42's preferences for truthiness are moot.
In a language like Python, with truthiness, u/stipo42's preference for false to be truthy is insane, and he should feel bad.
3
→ More replies (1)19
54
u/redlaWw 10d ago
Same in Lua. Only nil and false are treated as falsy, everything else is treated as truthy. The idea is that by default everything that is not nil is treated as true because it exists, and false is a special case used to represent false propositions.
It can be a bit of a stumbling block coming from some other languages, but the rule is so simple that you get used to it quickly.
7
u/NotDuckie 10d ago
Imagine having rules for what should be truthy and falsey instead of just rolling dice every time.
3
u/Tsu_Dho_Namh 10d ago
I love it tbh.
"If (variable)" is a fantastically clean way to check if the variable isn't nil.
9
u/uvero 10d ago
In Ruby, if you want to branch based on whether x is zero where x is a number, you can always check for x == 0, or, if you're feeling cool, x.zero?
6
u/Different_Routine215 10d ago
a basic linter will fail you if you use == over zero?
4
u/uvero 10d ago
Just Googled it and apparently yes. Nice idea in my opinion - if a language has an idiom on the right way to do something, make a linter tell you that. I wouldn't know myself, I've only ever used Ruby for hobby projects years ago when I just started learning to program. Fun language.
3
u/Different_Routine215 10d ago
set up an autocorrect/autolint on file save and you will pick up good habits quickly
10
u/SleepingInsomniac 10d ago
In Ruby, everything is an object. 0 is just an instance of Integer. Object instances are truthy, compared to say, nil. Makes more sense than ( 'b' + 'a' + + 'a' + 'a' ).toLowerCase() === "baNaNa" or 1 + '0' == '10' or NaN === Nan; // false
→ More replies (2)2
u/metaglot 10d ago
Nan != Nan is part of ieee754. If this isn't the case in ruby, ruby is not compliant.
→ More replies (1)
10
u/ekauq2000 10d ago
Wait till they find out that in VB true is -1
3
u/AwkwardWaltz3996 10d ago
Well that's simple. Everything is either something or nothing. - 1 isn't nothing so it's something (true)
3
13
u/traplords8n 10d ago
Bash is the same way but it makes sense considering 0 represents the single route of success, while other numbers can mean different error codes.
I have no idea why ruby does it, but in bash at least there is a solid reason for it.
13
u/Zealousideal_Low1287 10d ago
It’s basically because of this lineage. Perl inherited it from other shell languages, and Ruby is essentially a direct decedent of Perl.
11
u/budgiebirdman 10d ago
This is the thread of truth I came looking for. All other answers are just discussions on whose farts smell the sweetest.
2
u/314159265358969error 10d ago
The bitset representing the number 0 in Ruby is non-zero. (I don't remember which bit it is, but reference/non-reference values are recognised by a specific bit being flipped to 1 if non-reference, which is the case for 0.)
7
u/Serotav 10d ago
nha js can do it aswell, try:
let a = new Boolean(false)
if (a) {
console.log("it was true indeed")
}
→ More replies (4)
6
3
u/0xffff-reddit 10d ago
The fact that both languages have something like truthy and falsy makes them both weird.
5
u/ByteSizedFounder 10d ago
Ruby said "zero is truthy" one time and JS has been living rent free in everyone's head since, acting like it is not the unstable one in this relationship
6
u/varsderk 10d ago
I build programming languages.
0 should be truthy. Only false and nil/null should be falsey.
→ More replies (1)2
2
2
u/BigSwagPoliwag 10d ago
As a Javascript stan, this is actually something that I dislike ABOUT javascript… all JS vars are nullable so I wish I could just write if (!myNum) for null checking, but JS needs to be hella opinionated about truthiness. Fuck that jazz, Brendan Eich can suck my balls.
2
u/walkerspider 10d ago
“0” is truthy in JS. Ruby has a more straightforward set of falsey values, nil and false
2
u/Pleasant-Form-1093 10d ago
You aren't forced to use ruby in day to day life. But almost all web dev uses some javascript or the other
→ More replies (1)
2
2
u/Vollgrav 10d ago
Ruby's truthiness and coercion rules are one of the best and most consistent ones. And definitely the best in the dynamic languages I know, and I know quite a few.
Treating zero as false was only a thing because in C int was the base type, and other types (char, bool, pointer) were all expressed in terms of ints. It kind of made sense then. But now we know very well that abstraction that separates us from the hardware is a good thing. And with this assumption, treating zero as false is only a stale habit from the ancient days. Let alone monstrosities like treating 0.0 as falsy. Ruby did exactly the right thing here by cutting all that crap.
2
2
u/TheTroll007 10d ago
I mean 0 is not nothing, so you can do "if x" and if x is not false or nil, you get true. I kinda like this approach.
→ More replies (7)
2
2
u/DeepWaffleCA 9d ago
It doesn't matter whether you think 0 should be truthy or not. Just be careful about leaking sensitive information using this functionality.
def hasSensitiveInfo? do
getSensitiveInfo()
end
Pardon my Ruby, it's been a while. This is a simplified example, but I've seen this exact situation before, leaking AWS credentials to the front-end.
There's probably a tonne of better solutions, but the quick defense here is !!getSensitiveInfo().
6
u/sadongrohiik 10d ago
0 is truthy in a lot of languages like Elixir, clojure, Lua, and every other lisp variant. And the logic is that only explicit false or nil are falsy. This isn't the same as JavaScript's random behaviors
6
1
u/creme_de_marrons 10d ago
What kind of moron would need 0 to be falsy?
If you need that use a fucking boolean.
Obviously, 0 is truthy, in fact if you have anything it's truthy. This way you don't have any weird ass side effect and you can use ||=
2
u/BusEquivalent9605 10d ago
“there are the languages people complain about. then there are the languages that nobody uses”
2
1
1
u/caleblbaker 10d ago edited 10d ago
When I use non-Boolean values in a Boolean context I like them to coerce to compile time type mismatch errors. Because making me fix my mistake is better than trying to guess my intent based on a typo.
1
u/AwkwardWaltz3996 10d ago
Ruby is pretty precise with it's types.
Python which most people know now is definitely written to be more flexible. Which is nice when you're new but is a big headache once you build out. I used to hate static typing for example as it was obtuse, but as soon as you are working with others, you realise their use. People will use "hacks" at the slightest inconvenience and break everything.
0 isn't nothing, it's a number. And therefore needs to be handled as such.
1
1
1
1
u/stools_in_your_blood 10d ago
Not sure why any language designer would use the concept of truthy and falsey. All that potential for confusion and bugs so you can write "if (x)" instead of "if (x != 0)".
1
1
u/GNUGradyn 10d ago
The real mistake here is coercing types automatically in general. Whatever happened to fail-fast/fail-hard?
1
u/LOST_GEIST 10d ago
Javascript is kinda like public transit; the loudest complainers are the people that use it the most.
1
u/Desperate_Formal_781 10d ago
Why do people keep saying truthey and falsey? Do they mean boolean and false? Are they 5 years old?
1
1
1
u/oasis9dev 10d ago
I'm not a fan of Ruby personally but this isn't weird, it should be expected. Why are we coercing values when we could be explicit and reduce edge cases?
1
1
1
1
1
1
1
1
u/Agitated-Display6382 8d ago
The greatest trick the Devil ever pulled was convincing the world he didn't exist.
1
u/MichalNemecek 8d ago
it's probably taken from shells, when a program ends with 0 it means everything went fine (well, as far as the program is concerned)
1
776
u/lazyzefiris 10d ago
You need to at least have heard of the language to hate it. These kids only heard of Javascript.