💭
Nimでセマンティックバージョン比較
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