• [^] # Re: Ruby On Rails

    Posté par (site web personnel) . En réponse à la dépêche Support d'Ajax dans Ruby on Rails. Évalué à 2.

    > Autrement dit, ta variable n'est pas d'un type bien définie.
    > Quand tu écris $a = "3 maisons" on lui a assigné une valeur de type chaîne de caractères.

    Il n'y aurait pas contradiction entre ces deux phrases ?
    Pour moi qu'une fonction gettype() puisse retourner un type déterminé non ambigue et toujours le même dans une situation similaire veut bien dire qu'un tel type existe (contrairement à d'autres domaines, je pense par exemple à sqlite pour qui tout est chaine de caractère et qui ne "résoud" les choses en nombre que lors des opérations genre addition).

    > Mais lorsque tu fais $a + 1, si ta variable était de type fort, alors une erreur aurait
    > été levée parce que l'on ne peut pas additionner une chaîne avec un entier.

    Le fait que tu puisses faire "3 maisons " +1 ne veut pas dire que "3 maisons" n'a pas de type, ça veut dire qu'il y a transtypage implicite (le terme même de transtypage sous entend qu'il y a un type d'ailleurs).
    Notes que des transtypages on peut aussi en avoir dans des langages très fortement typés comme en C ou C++ (jamais eu l'avertissement du compilo qui a casté un char dans un int ? un pointeur dans un int ? ou le contraire ?). Ca n'en fait pas des typages faibles pour autant.

    > Si par contre, on avait $a = $a + 1 => "3 maisons1" alors on aurait pu dire
    > qu'effectivement $a pourrait être de typage fort avec un transtypage implicite
    > correcte qui est de convertir l'entier 1 en sa représentation chaîne de caractères
    > avant de la passer à l'opération de concaténation '+' (si '+' est l'opérateur de
    > concaténation bien sûr)


    Ah ? donc si j'emploi l'opérateur de concaténation (en php c'est le point) et que ça donne ce que tu dis c'est un langage typé fort ? planté ... $a = $a . 1 donne effectivement "3 maisons1"

    Pourquoi ? la seule différence entre ton $a = $a + 1 => "3 maisons1" et ce qu'il se passe réellement c'est qu'il n'a pas fait le transtypage sur la même donnée que tout. Il a fait le transtypage sur le $a au lieu de le faire sur le 1 (ce qui est plutot intelligent vu que dans l'exemple il s'agit d'une addition et pas d'une concaténation, qui sont des opérateurs différents). Mon addition est une opération qui attend deux nombres, on lui donne une chaine, il convertit donc la chaine en nombre implicitement. Ca ne contredit pas du tout la présence de typage.
    Dans l'absolu l'opération est la même (transtypage), les principes mis en jeu sont les mêmes (repérer qu'une des valeurs n'a pas le type attendu et faire un transtypage implicite quand c'est possible pour faire concorder).

    Ceci dit ça montre bien ce que je disais : la limite du typage fort et du typage faible n'a rien d'une limite claire et objective (même si on est tous les deux d'accord pour dire que le typage de PHP est on ne peut plus faible)