Gå til innhold

[Løst] String og boolean


Anbefalte innlegg

Videoannonse
Annonse

Kanskje greit å teste det ut før man påstår !== vil fungere i dette tilfellet? Det vil nemlig ikke gjøre det. === og !== sjekker i tillegg til (u)likhet om de også har samme type. Derfor er "true" !== true siden string ikke er det samme som boolean. Det man nok ønsker seg her er kanskje $string != "true"?

 

Her kan man forøvrig finne en liste over hva som skjer når variabler av ulik type sammenlignes.

Lenke til kommentar

Kanskje greit å teste det ut før man påstår !== vil fungere i dette tilfellet? Det vil nemlig ikke gjøre det. === og !== sjekker i tillegg til (u)likhet om de også har samme type. Derfor er "true" !== true siden string ikke er det samme som boolean. Det man nok ønsker seg her er kanskje $string != "true"?

Her kan man forøvrig finne en liste over hva som skjer når variabler av ulik type sammenlignes.

Kanskje best å lese gjennom ordentlig før du klager på andre. Det han over deg sier er riktig, og slik jeg forstår TS også det han spør etter.

 

Han lurer på hvorfor dette alltid blir false og går i elsen:

"Dette er en test" != true

 

Og årsaken er akkurat det han over deg sier, at det er fordi en streng er å regne som true så lenge den har innhold når man bruker != eller ==.

Lenke til kommentar

Kanskje greit å teste det ut før man påstår !== vil fungere i dette tilfellet? Det vil nemlig ikke gjøre det. === og !== sjekker i tillegg til (u)likhet om de også har samme type. Derfor er "true" !== true siden string ikke er det samme som boolean. Det man nok ønsker seg her er kanskje $string != "true"?

 

Her kan man forøvrig finne en liste over hva som skjer når variabler av ulik type sammenlignes.

 

Testet nå. Ganske riktig. !== returnerer Resultat 1.

 

Fins en liten sandkasse her.

Lenke til kommentar

Jeg vet ikke jeg, literalen true burde ikke konformere til typen string, og vice versa for boolean, så jo, dette er absolutt en av de tingene som gjør det dårlig, hvertfall når du setter det i sammenheng med hva en type er. Runtime burde klage når en prøver å sammenligne string og boolean.

 

Uansett, jeg sier ikke at PHP og Python er dårlige scriptespråk i seg selv, de har bare et ikke-eksisterende statisk typesystem (altså, sett fra brukeren). Det er faktisk av og til helt genialt intuitivt å programmere i Python, men grunnen til at typer i det hele tatt eksisterer, er fordi det gjør livet mye lettere for programmereren å utvikle store, tunge programmer. Nå snakker jeg ikke om typer som i bits og bytes i minne... Det at sjeldne, semantiske feil skjer under runtime er ikke en god ting!

 

Det finnes store rammeverk skrevet i Python, men Python er et språk som skal brukes til å kjapt kaste sammen noe som forenkler arbeidsdagen din.

Endret av LostOblivion
Lenke til kommentar

Det er bare sånn dynamiske, typeløse språk fungerer. Å sammenligne epler og pærer er helt gyldig, den ene konverteres bare til det andre og sammenligningen kan utføres. Det samme kan forsåvidt også utføres i et typesterkt språk som C++. Man må bare definere f.eks. operator == for den typen sammenligning så kan epler og pærer sammenlignes uten problemer.

 

Å skulle begynne å lage runtime feil fordi man sammenligner en string mot en bool tilsier bare at du ønsker et typesterkt språk og ikke liker de typeløse. Skulle man gjort det som du ønsker så måtte man også kunne garantere for variabeltypen før kjøring, og det er komplett umulig. Hva skjer hvis man har en if / else og tilegner to forskjellige datatyper avhengig om det er if eller else? Hvordan ser du for deg at en query-funksjon skal kunne returnere både boolean og int/ressurs avhengig av situasjonen? Det er ting man gjør i et dynamisk språk som vil være særdeles vrient slik du ønsker deg ting.

Lenke til kommentar

C++ er ikke sterkt typet. Det er forskjell på statisk og dynamisk typede språk, men sterkt og svakt typede språk er ikke det samme som de over, henholdsvis.

 

C#, Java, og Python er alle eksempler på sterkt typede språk, men kun Python har dynamiske typer.

 

Det er slik det er ja, og det har sine fordeler og ulemper, men den største ulempen med både dynamiske og svakt typede språk, er at det er vanskeligere å finne feil før release. I slike språk kan du aldri være helt sikker på om programmet du har laget ikke vil gi en semantisk feil, men samtidig gir det deg en større frihet. Dog, dette er kun en frihet som gjør det kjappere å programmere i språket, men som kan gi det ganske heftige problemer senere.

Lenke til kommentar

Table av forskjellige sammenligninger : http://habnab.it/php-table.html

 

Forøvrig har http://me.veekun.com...-of-bad-design/ en del klager på == sin måte å behandle ting på.

 

Forresten så oppfører python seg helt annerledes på disse tingene. Hvis man tar "if var:" i python så blir det noenlunde tolket som "if bool(var):" - men hvis man sammenligner så blir det ingen konvertering.

 

Litt python eksempel kode:

 

 

>>> True
True
>>> "asd"
'asd'
>>> bool("asd")
True
>>> bool(" ")
True
>>> bool("")
False
>>> "asd" == True
False
>>> "" == True
False
>>> "" == False
False
>>> "" == " "
False
>>> "" == 0
False
>>> "" == "0"
False
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> 1 == "1"
False
>>> 1 == int("1")
True
>>> 1 == int("01")
True
>>> 1 == int("true")
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'true'
>>> None == False
False
>>> None == True
False
>>> None == ""
False
>>> None === ""
 File "<stdin>", line 1
None === ""
	   ^
SyntaxError: invalid syntax
>>> bool( [] )
False
>>> [] == False
False
>>> None in []
False
>>> False in []
False
>>> True in []
False
>>> "1" in [1]
False
>>> 1 in [1]
True
>>> int("1") in [1]
True
>>> 1 in "1"
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'in <string>' requires string as left operand, not int
>>> "1" in "1"
True
>>> {}.get("asd")
>>> print {}.get("asd")
None
>>> {}.get("asd") == False
False
>>> {}.get("asd") == True
False
>>> {}.get("asd") == None
True
>>>

 

 

 

Vi har forresten allerede hatt en lang diskusjon på forumet angående dynamiske datatyper.. Foreslår at folk ikke starter en ny slik diskusjon i en urelatert tråd som denne, eller i det minste leser den tråden først.

 

Også, angående statisk typede / dynamisk typede vs compile time feil...

 

Etter å ha programmert en del i begge typer språk, kan jeg trygt si at praktiske forskjeller er minimal. Og er forresten mye det samme i Java / C#. Bare at der kommer de frem som casting problemer og NullReferenceException :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...