Я ищу способ хранения данных в VBS какмагазин координаты в ассоциативном массиве
[ 0 => [posX, posY], 1 => [posX, posY] ]
Любопытное ассоциативный массив с координатами в качестве значений.
Я ищу способ хранения данных в VBS какмагазин координаты в ассоциативном массиве
[ 0 => [posX, posY], 1 => [posX, posY] ]
Любопытное ассоциативный массив с координатами в качестве значений.
Ассоциативные массивы называются Dictionary
в VBScript. Вы бы хранить координаты в них, как это:
Set coords = CreateObject("Scripting.Dictionary")
coords.Add 1, Array(1, 5)
coords.Add 2, Array(3, 2)
WScript.Echo coords(1)(1) 'ouput: 5
WScript.Echo coords(2)(0) 'ouput: 3
С учетом сказанного, учитывая ваш пример, который вы можете создать массив словарей вместо словаря массивов:
Sub AddCoordinates(ByRef list, posX, posY)
Set d = CreateObject("Scripting.Dictionary")
d.Add "posX", posX
d.Add "posY", posX
ReDim Preserve list(UBound(list)+1)
Set list(UBound(list)) = d
End Sub
ReDim coords(-1)
AddCoordinates(coords, 1, 5)
AddCoordinates(coords, 3, 2)
...
WScript.Echo coords(0)("posY") 'ouput: 5
WScript.Echo coords(1)("posX") 'ouput: 3
Массив пользовательские объекты были бы еще одним вариантом:
Class Point
Private posX_
Private posY_
Public Property Get posX
posX = posX_
End Property
Public Property Let posX(val)
posX_ = val
End Property
Public Property Get posY
posY = posY_
End Property
Public Property Let posY(val)
posY_ = val
End Property
End Class
Sub AddCoordinates(ByRef list, posX, posY)
Set p = New Point
p.posX = posX
p.posY = posX
ReDim Preserve list(UBound(list)+1)
Set list(UBound(list)) = p
End Sub
ReDim coords(-1)
AddCoordinates(coords, 1, 5)
AddCoordinates(coords, 3, 2)
...
WScript.Echo coords(0).posY 'ouput: 5
WScript.Echo coords(1).posX 'ouput: 3
Удивительный ответ, спасибо большое. Последний вопрос: можно ли найти «ближайший» элемент в словаре? Например, у меня есть координаты в 0 и 100. Если я получу 75, мне бы хотелось узнать ближайшие координаты (0 и 100 в этом случае). Я хочу интерполировать отсутствующие координаты, поэтому это было бы невероятно полезно. – nehalist
Возможно, вы захотите опубликовать новый вопрос с небольшим пояснением (и, возможно, некоторыми примерами), потому что я не понимаю, что вы подразумеваете под «интерполировать отсутствующие координаты» здесь. –
'Словарь' не является вашим единственным вариантом, также будет работать' Array' внутри 'Array'. 'coords = Array (Array (1, 5), Array (3, 2), ...) ', вы бы назвали его с помощью ординалы, как' posX = coords (1) (0) ', равным' 3' в этом примере. – Lankymart
Несомненно, вот так. Словарь - это ключевое решение vbscript.
Set objDictionary = CreateObject("scripting.dictionary")
objDictionary.Add 0, Array(1, 2)
objDictionary.Add 1, Array(3, 4)
WScript.Echo join(objDictionary.item(0)) '=>1 2'
Как и другие комментарии, vbscript больше не используется. Вот пример, в более позднем языке, как Рубин
hash = {}
hash[0] = [1, 2]
hash[1] = [3, 4]
# gives {0=>[1, 2], 1=>[3, 4]}
или в качестве одной линии
Hash.new{}.merge(0 => [1, 2], 1 => [3, 4])
# gives {0=>[1, 2], 1=>[3, 4]}
Если я правильно помню (я не использовал VBScript более 15 лет), ближайшая структура данных к ассоциативным массивам - это * словарь *. Однако ваши данные образца выглядят как обычные массивы: -? –
какая версия vbscript? Эта вещь имеет 20-летнюю историю, теперь .. –
@ MarcusMüller C++ 37 лет в этом году и по-прежнему является одним из наиболее широко используемых языков производства, поэтому в чем ваш смысл? Возраст не должен быть определяющим фактором, если они хотят, чтобы скрипт с VBScript позволял им. – Lankymart