Co można zrobić tylko z intami w weakly-typed językach?

0

Piszę właśnie dokumentację do https://t-regx.com i potrzebuję przykładu jakiejś operacji którą można wykonać tylko na intach, a nie na stringach - i mając stringa trzeba uprzednio convertować/castować/zamieniać na inta - i też się zastanawiam czy w weakly typed językach w ogóle jest taka operacja, bo jak w JS '4' + '4' to coś innego niż 4 + 4 (i trzeba zamienić string na int), tak w PHP są do tego dwa operatory + oraz ., więc '4' + '4' to zawsze 8.

Any ideas?

0

'4' + '4' daje w PHP 8? Ale durny język

3
Pinek napisał(a):

'4' + '4' daje w PHP 8? Ale durny język

Tak, + to zawsze dodawanie, . to zawsze konkatenacja stringów, więc '4' + '4' == 8, a 4 . 4 = '44'.

1

@Pinek: nie durny tylko mający dynamiczne typowanie. Do łączenia stringów używasz . jak zrobisz + to znacz, że ma zrobić rzutowanie stringów na liczby i dodać. Jak się nie da to leci exception

0
mr_jaro napisał(a):

Jak się nie da to leci exception

Zapomnij o exceptionach w standardowej libce PHP. Wtedy leci warning, którego się nie da złapać.

1

@TomRiddle: powiem ci, że 8 lat w php i nie przychodzi mi nic do głowy. Możesz spróbować sprawdzić czy wszystko się zachowuje tak samo jak wymusisz pilnowanie typów declare(strict_types=1)

0
mr_jaro napisał(a):

@TomRiddle: powiem ci, że 8 lat w php i nie przychodzi mi nic do głowy. Możesz spróbować sprawdzić czy wszystko się zachowuje tak samo jak wymusisz pilnowanie typów declare(strict_types=1)

Bo tak, w tej libce chodzi o to że jak ktoś użyje jakiejś funkcji, i stanie się coś niespodziewanego (tak jak to w php się lubi dziać, np zmiana false na 0) to ma lecieć wyjątek, a nie próbować robić coś dalej. Dlatego napisałem do libki funkcje parseInt() która zwraca inta tylko wtedy, kiedy faktycznie jest intem, czyli ^[-+]?\d+$ (bez spacji, same cyfry, bez e, przecinków, etc. ma być int).

Ale w dokumentacji jakoś chciałbym podać uzasadniony przypadek użycia, tylko po co skoro $i->string() zadziała tak samo jak $i->parseInt() (pomijając wcześniejszą walidację). Noi tu jest problem

0

można byłoby zrobić dwie funkcje obie pobierałyby 2 argumenty z tym że jedna dopasowywałaby się pod 'arg' i robiłaby konkatenację a druga pod sam arg i leciałaby suma
tylko trochę to głupie :D

0
au7h napisał(a):

można byłoby zrobić dwie funkcje obie pobierałyby 2 argumenty z tym że jedna dopasowywałaby się pod 'arg' i robiłaby konkatenację a druga pod sam arg i leciałaby suma
tylko trochę to głupie :D

Ludzie czytając dokumentację powinni widzieć funkcje które znają - znajomość języka powinna pomagać w uczeniu się biblioteki.

0

No właśnie z intem jakoś nie widzę problemu, ze stringiem już bardziej chociażby w warunkach.

1
mr_jaro napisał(a):

No właśnie z intem jakoś nie widzę problemu, ze stringiem już bardziej chociażby w warunkach.

Jedyne co mi przychodzi to zamiast:

'siema' < 4;

lepiej mieć

parseInt('siema') < 4

bo przynajmniej się wywali, zamiast zwrócić true i zastawić na mnie buga-pułapkę.

0

@TomRiddle nie wiem o jakim języku mówisz, ale JavaScript się nie wywali, tylko parseInt('siema') zwróci NaN, więc
parseInt('siema') < 4
to tak jak
NaN < 4
czyli false
(przy czym NaN > 4 też będzie false).
Więc jak najbardziej może zastawić buga-pułapkę

Piszę właśnie dokumentację do https://t-regx.com i potrzebuję przykładu jakiejś operacji którą można wykonać tylko na intach, a nie na stringach -

nie wiem, czy tylko to, ale w JS jak chcesz wywołać jakąś metodę, która jest tylko w liczbach, np. nie zrobisz tak:

"1.33321".toFixed(2)

chyba, że wcześniej tego stringa przekonwertujesz jakoś do liczby:

parseFloat("1.33321").toFixed(2)
0
LukeJL napisał(a):

@TomRiddle nie wiem o jakim języku mówisz, ale JavaScript się nie wywali, tylko parseInt('siema') zwróci NaN, więc
parseInt('siema') < 4
to tak jak
NaN < 4
czyli false
(przy czym NaN > 4 też będzie false).
Więc jak najbardziej może zastawić buga-pułapkę

Już wolę mieć wszędzie NaN < 3 i NaN > 3 (czyli false, false) niż 'siema' < 3 i 'sieam' > 3 (czyli false, true)

1

Ja bym patrzył na https://www.php.net/manual/en/types.comparisons.php ;)
Masz tam perełki jak 0 == "php" vs "0" == "php", jak widać bez casta na inta dostaniesz inny wynik porównania bo loose comparison w php to rak.

1 użytkowników online, w tym zalogowanych: 0, gości: 1