harry’s memorandum

おれおれメモ

vbsの配列を少しだけ使いやすくするために配列Classを作ってみた。

rubyperlを使った後にvbsを使うと面倒で仕方がない。
せめて配列ぐらいは、LLっぽくできないものかと思い少し試してみた。気のせいかもしれないがもしかしたらvbsもやればできる子かもしれないと思った。

できたClass。配列のように扱うけど中身はHash(Dictionary)。

Option Explicit

Class CustomArray

  Public x, items

  Sub Class_Initialize()
    Set items = CreateObject("Scripting.Dictionary")
    x = 0
  End Sub
  
  Sub Class_Terminate()
    items.removeall
  End Sub

  Public Function push(ByVal item)
    items.item(x) = item
    x = x + 1
  End Function

  Public Function pop()
    Dim temp
    temp = items(x)
    items.Remove (x)
    x = x - 1
    pop = temp
  End Function

  Public Function size()
    size = items.Count
  End Function

  Public Default Property Get item(byval idx)
    item = items(idx)
  End Property

  Public Property Let item(ByVal idx, ByVal value)
    dim i
    if isNumeric(idx) Then
      if x >= idx then
        items.item(idx) = value
      else
        Do While idx > x
           x = x + 1
           items.item(x) = ""
        Loop
        items.item(idx) = value
      end if
    End if
  End Property

  Public Property Set item(ByVal idx, ByVal value)
    items.item(idx) = value
  End Property
  
  Public Function sort()
    Dim i, j, temp
    For Each i In items
      For Each j In items
        If (items.item(i) <= items.item(j)) Then
          temp = items.item(i)
          items.item(i) = items.item(j)
          items.item(j) = temp
        End If
      Next
    Next
  End Function

  Public Function reverse()
    Dim i, j, temp
    For Each i In items
      For Each j In items
        If (items.item(j) <= items.item(i)) Then
          temp = items.item(j)
          items.item(j) = items.item(i)
          items.item(i) = temp
        End If
      Next
    Next
  End Function

  Public Function uniq()
    Dim i, j, temp, empflg
    empflg = 0 : j = 0
    Set temp = CreateObject("Scripting.Dictionary")
    For Each i In items.keys
      if items(i) = "" then
        empflg = 1
      else
        temp.item(items(i)) = i
      end if
    Next
    items.removeall
    if empflg = 0 then
      j = 0
    else
      j = 1
      items.item(0) = ""
    end if
    For Each i In temp.keys
      items.item(j) = i
      j = j + 1
    Next
    set temp = Nothing
  End Function

End Class

javascriptrubyぽく、pushやpopで入れたり出したり。

Dim arr, x
set arr = new CustomArray 

arr.push("aaa")
arr.push("bbb")
arr.push("aaa")
arr(1) = "xxx"
arr(3) = "yyy"
arr(5) = "yyy"
arr(7) = "aaa"

For x = 0 To arr.size -1
  WScript.echo x & " " & arr(x)
Next
'#=>0 aaa
'#=>1 xxx
'#=>2 aaa
'#=>3 yyy
'#=>4
'#=>5 yyy
'#=>6
'#=>7 aaa

WScript.echo arr.pop
'#=>aaa

sortはrubyでいう破壊的メソッド。

Dim arr, x
set arr = new CustomArray 

arr.push("aaa")
arr.push("ccc")
arr.push("bbb")
arr.push("aaa")

arr.sort
For x = 0 To arr.size -1
  WScript.echo x & " " & arr(x)
Next
'#=>0 aaa
'#=>1 aaa
'#=>2 bbb
'#=>3 ccc

uniqもrubyでいう破壊的メソッド。Hash(Dictionary)は便利ですね。

Dim arr, x
set arr = new CustomArray 

arr.push("aaa")
arr.push("ccc")
arr.push("bbb")
arr.push("aaa")

arr.uniq
For x = 0 To arr.size -1
  WScript.echo x & " " & arr(x)
Next
'#=>0 aaa
'#=>1 ccc
'#=>2 bbb