💭

Nimでセマンティックバージョン比較

2023/12/20に公開

phpのversion_compare関数のような関数を作りたかった。

import strutils

proc compareVersions(version1, version2: string): int =
  var parts1 = version1.split('.')
  var parts2 = version2.split('.')

  # メジャー、マイナー、パッチと順に確認する。
  for i in 0 .. min(parts1.len, parts2.len) - 1:
    let num1 = parseInt(parts1[i])
    let num2 = parseInt(parts2[i])
    
    if num1 < num2:
      return -1
    elif num1 > num2:
      return 1

  # 桁数が多い方が大きいとする
  if parts1.len < parts2.len:
    return -1
  elif parts1.len > parts2.len:
    return 1

  return 0

試しに実行してみよう

test.nim
# ここはさっきと同じ。
import strutils

proc compareVersions(version1, version2: string): int =
  var parts1 = version1.split('.')
  var parts2 = version2.split('.')
  
  for i in 0 .. min(parts1.len, parts2.len) - 1:
    let num1 = parseInt(parts1[i])
    let num2 = parseInt(parts2[i])
    
    if num1 < num2:
      return -1
    elif num1 > num2:
      return 1

  if parts1.len < parts2.len:
    return -1
  elif parts1.len > parts2.len:
    return 1

  return 0


# 使用例
let storedVersion = "2.3.1"
let currentVersion = "2.3.0"

let result = compareVersions(storedVersion, currentVersion)

if result > 0:
  echo "アップデートが必要です."
elif result < 0:
  echo "アップデートは不要です."
else:
  echo "バージョンは同じです."

test.nimを作ったら下記で実行

$ nim c -r test.nim

Discussion