WAT - ruby and javascript

1 472 vues

Pour les lombriks développeurs

Envoyé par nevaram le 25 septembre 2017 à 10h33

+ 7 -

BarneyGumbles Lombric Shaolin

On est une bande de geeks, on se fend la gueule !
Image de BarneyGumbles
+ 3 -

Zap Vermisseau

En Python, plus rapide et surtout bien plus adapté aux lombrics !
i = float("9e999")
s = [str(-i+i).capitalize()]*9
print("%s Batman!" % ''.join(s))
+ 8 -

Tronix117 Vermisseau

Marrant pour le spectacle ;)

En Javascript :

• le `+` a trois utilités : si les deux termes sont des nombres, alors il les additionne, si les deux termes ne sont pas des nombre il sert à concaténer (rassembler) deux chaines de caractères. Dans les autres cas il permet de convertir le terme qu'il précède en Nombre.
• Un Objet converti en String sans méthode `toString` défini manuellement renverra `"[object Object]"`.
• Quand un tableau `[ ]` est converti en chaine de caractère, chacun de ces éléments sera séparé par une `,` ainsi `[1, 'abc', ''].toString()` donnera `"1,abc,"`. Pour rappel, un Array est un Objet un peu particulier, et qui défini la méthode `toString` d'une façon similaire à : `Array.prototype.toString = function () { this.join(",") }`
• Si une ligne commence par `{` alors c'est considéré comme étant un block (non un objet) qui se termine au prochain `}`
• Converti au même type (typecasted) : 0, "", false, undefined, null sont égaux


En partant de là :
• `[] + []` => "" – (chaine vide) car comme les deux termes ne sont pas des nombres, le PLUS essaie de convertir les deux termes en String, et un Array vide converti en string donne une string vide. On se retrouve donc avec `"" + ""` et la concaténation de deux String vide donne bien une String vide cad `""`
• `[] + {}` => "[object Object]" – Même réflection : `"" + "[object Object]"` donne bien `"[object Object]`
• `{} + []` => 0 – Ici la ligne commence par un block qui ne fait rien et se termine immédiatement, donc `{}` est ignoré, ce qui nous laisse `+[]`, ici le plus précède un terme qui n'est pas un nombre, il essai donc de le convertir en nombre, sauf qu'on ne peut généralement convertir q'une String en nombre. Il est donc déjà converti en String `""`, puis une String vide typecasted est égale à 0, donc la conversion d'un tableau vide en nombre donne 0.
• `{} + {}` => NaN – Même chose ici, cela donne `+{}` et essai de convertir un objet en nombre, ce qui équivaut à le convertir d'abord en String `+"[object Object]"` puis en nombre, sauf que cette String ne contient pas de nombre, donc => Not-A-Number aka `NaN`

• Array(16) => ,,,,,,,,,,, – Son interpréteur converti en String tout ce qui lui est passé avant de l'afficher, ainsi comme vu plus haut, un tableau vide de 16 élément, retourne bien 15 virgules.
• Array(16).join("wat") => watwatwat... – Totalement normal
• Array(16).join("wat" + 1) => wat1wat1wa... – Totalement normal, un des termes autour du plus est une string, le deuxième sera donc converti en string avant d'être concatén
• Array(16).join("wat" - 1) => NaNNaNNa.... – Le `-` ne fonctionne qu'avec des nombre, il essaie donc de convertir les deux termes en Nombre, comme "wat" n'est pas un nombre, c'est donc converti en `NaN` et `NaN - 1` c'est aussi `NaN`.
+ 6 -

glurp En réponse à Tronix117 LoMBriK addict !

Merci ! Enfin quelqu'un qui sait de quoi il parle !
J'avais envie de hurler durant toute la vidéo, clairement le gars n'aime pas Javascript et ne connait pas Javascript.
+ 3 -

Tronix117 En réponse à glurp Vermisseau

Après ça m'a fait rire quand même, mais ça aurait été intéressant qu'il explique pourquoi !

---

(c'est chiant la limite de 25 lignes pour un commentaire).

Pour Ruby :

* Lorsqu'une variable est assignée elle est implicitement assignée à `nil` en tout premier lieu.

Ainsi lorsqu'on fait `a = b`, alors ruby fait :
`a = nil; a = b`, sauf que b n'existe pas donc : erreur

Par contre pour `a =a` :
`a = nil; a = a`, cela fonctionne car a est initialisé avec une valeur `nil`, donc au final `a => nil`

Pour le méthode missing, c'est simplement que le premier membre de la phrase est considéré comme un appel de fonction, et le reste sont des paramètres. En Ruby, un truc top c'est de pouvoir surcharger ce qu'il se passe quand une fonction n'existe pas, et c'est ce qu'on fait ici, on dit simplement d'écrire tous les arguments quand on appelle une fonction qui n'existe pas. Fun mais pas exceptionnel, et à ne jamais utiliser de cette façon.

Je crois que j'ai tout couvert ;)
+ 0 -

AthranZara En réponse à Tronix117 Vermisseau

Si ruby assigne a 'nil' automatiquement, pourquoi quand il tape 'a' ca met une erreur, et pas nil ? :)
+ 0 -

Tronix117 En réponse à AthranZara Vermisseau

Je me suis mal expliqué, j'ai donné l'exemple pour `b`, en fait ruby assigne automatiquement à `nil` avant toute première ASSIGNATION (pas utilisation), c'est une sorte de déclaration. Quand tu utilises `a` il n'est pas déclaré, donc erreur. Par contre quand tu fais une assignation avec `a = xxxx`, alors `a` est tout d'abord déclaré à `nil` avant d'être assigné avec `xxxx`. Je ne sais pas si c'est plus clair.
+ 8 -

Maurice En réponse à Tronix117 Suce pour un titre

J'ai rien pigé même avec l'explication.. Mais je vous envie, ça a l'air marrant ...
+ 0 -

AthranZara En réponse à Tronix117 Vermisseau

Le problème est le côté non fortement typé.
Je connais les raisons de 1 + "1" != "1" + 1 mais ca n'empeche que c'est quand meme chiant
+ 0 -

Tronix117 En réponse à AthranZara Vermisseau

Si on sait ce qu'on fait, ce côté est intéressant, un langage prototypé a pas mal d'avantages, tout dépend du besoin. Ça essaie d'évoluer dans le bon sens, notamment avec l'essor de TypeScript qui amène le typage au langage, et permet le fail-early.
+ 0 -

AthranZara En réponse à Tronix117 Vermisseau

"si on sait ce qu'on fait", ok donc on va sur le terrain de la fiction :) A mon sens c'est du même accabit que "les tests c'est pour ceux qui savent pas coder" ou encore ceux qui mettent "langages connus [...] UML" sur leur CV :)
Mais bon, pour être honnete je suis dev Java et ce débat on l'a au taff avec les devs Front qui font du tres bon boulot en JS & TS, meme si c'est pas grace a ces "avantages" que le JS revient sur le devant de la scène amha, mais plutôt grace a son comportement simili asynchrone.
+ 0 -

Tronix117 En réponse à AthranZara Vermisseau

Ahah pour les tests !
D'ailleurs Kotlin me donnerait "presque" envie de refaire du Java :)

Le pseudo asynchrone de Javascript, est simplement fait de la même façon que dans beaucoup de programme non javascript (`while(1)`). Sauf que l'Event Loop est la base de la techno, et donc transparente. Le vrai asynchrone n'existe pas vraiment, même avec les system interupts de toute façon.
+ 0 -

Nap Vermisseau

putain, le javascript ça me donne envie de gerber, je préfère le visualbasic
+ 0 -

Frankfurt Lombric Shaolin

Egalement en javascript

null == 0 (false)
null < 0 (false)
null < = 0 (true) (sans l'espace entre < et =)


https://stackov...-but-not-null-0
Inscrivez-vous ou Connectez-vous pour envoyer un commentaire
132