webForumDet fria alternativet

Dictionary-object i funktioner? Funkar inte?

ASP

5 svar · 199 visningar · startad av Stahre

Medlem sedan feb. 20033 inlägg
Frågan#1

Dethär är mitt första inlägg i dethär forumet så jag hoppas att jag inte gör bort mig helt. :)

I helgen så råkade jag ut för ett lite konstigt beteende i ASP.

Jag försökte skicka in ett dictionary-object i en funktion men det blev lite fel... Det gick nämligen inte att använda Exists() om jag inte hade läst ut ett värde från arrayen(?)!.

Tror exemplet nedan förklarar bättre, den _borde_ skriva ut:

This is a test1.
This is a test2.

men i alla fall på den servern jag jobbar mot så får jag:

Nope1.
This is a test2.

Snälla! Hjälp mig någon! Förklara vad som händer. För jag blir galen snart. :) (Går iofs att programmera runt problemet men det känns inte så bra att behöva göra det.)

<%
Function test1(foo)
If (foo.Exists("yow")) Then
test1 = "This is test1.<BR>"
Else
test1 = "Nope1.<BR>"
End If
End Function

Function test2(foo)
i = foo.Item("yow")
If (foo.Exists("yow")) Then
test2 = "This is test2.<BR>"
Else
test2 = "Nope2.<BR>"
End If
End Function

Set bar = CreateObject("Scripting.Dictionary")

Response.Write test1(bar)
Response.Write test2(bar)

Set bar = Nothing
%>

Medlem sedan juni 20022 599 inlägg
#2

Jag hänger inte med riktigt ..

Eftersom du aldrig gör: bar.add "yow","whatever" så borde du väl egentligen förvänta dig:

Nope1.
Nope2.

, eller hur?

Anledningen till att test2 trots allt returnerar This is test2. är att i = foo.Item("yow") , i själva verket, skapar ett nytt (tomt) element.

If key is not found when attempting to return an existing item, a new key is created and its corresponding item is left empty.

Källa: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/jsproitem.asp

Medlem sedan feb. 20033 inlägg
#3

Doh... =)

Hm. Då får jag börja leta fel igen.

Fast lite förvirrande är det ändå när den skapar saker bara för att man söker efter dom. :)

"Jag tänker på den, alltså existerar den." ?

Medlem sedan juni 20022 599 inlägg
#4

Varför börjar den existera efter att jag hämtat den?

Tja, därför att Microsoft bestämt att det ska funka så ..?

Det brukar ju ofta vara så i script-språk att saker skapas när man referar till dom.

Att kunna skriva bara:

bar.Item("minNyckel")="mittvärde"

.. är ju smidigare än att behöva göra:

if not bar.Exists("minNyckel") then
	bar.add "minNyckel","mittvärde"
else
	bar.Item("minNyckel")="mittvärde"
end if
Medlem sedan feb. 20033 inlägg
#5

Får tacka för svaret :) Hade nog inte hittat det egentliga felet utan det.

Jag hade blandat siffror och strängar. :)

Dvs.

foo.Item(1) är inte samma som foo.Item("1")

Men sen så måste jag ändå få klaga lite på Microsoft... Jag vet inget annat språk där element skapas i en array bara för att man refererar dom.

foo.Item("banan") = "Hej"

...är en helt annan sak än...

hej = foo.Item("banan")

Medlem sedan juni 20022 599 inlägg
#6

foo.Item("banan") = "Hej"

...är en helt annan sak än...

hej = foo.Item("banan")

Kan bara hålla med. Men eftersom VBScript har nästan obefintlig felhantering så tycker
nog Microsoft att det är enklare att foo.Item("banan") skapar ett element och returnerar
en tom sträng om "banan" inte finns, snarare än att tvinga programmerare att hela tiden skriva:

if foo.Exists("banan") then
	hej = foo.Item("banan")
else
	hej = "" 'Eller nåt annat.
end if
254 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)