tutorial:nim:containers
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
tutorial:nim:containers [2024/03/11 19:44] – [タプル] freemikan | tutorial:nim:containers [2024/08/19 19:20] (現在) – freemikan | ||
---|---|---|---|
行 3: | 行 3: | ||
複数の値を保持することの出来るデータ型をコンテナと呼ぶことにします。コンテナの種類はいくつかあります。 | 複数の値を保持することの出来るデータ型をコンテナと呼ぶことにします。コンテナの種類はいくつかあります。 | ||
- | ====== 配列 | + | ===== 配列 ===== |
配列は同種の型の値を保持できる固定長のコンテナです。固定長であることは、作成した後にそのサイズを変更できないことを意味します。また、サイズはコンパイル時定数でなければなりません。 | 配列は同種の型の値を保持できる固定長のコンテナです。固定長であることは、作成した後にそのサイズを変更できないことを意味します。また、サイズはコンパイル時定数でなければなりません。 | ||
行 9: | 行 9: | ||
配列型の変数の宣言は、型を明示的に書くと次のようになります。 | 配列型の変数の宣言は、型を明示的に書くと次のようになります。 | ||
- | <codeprism lang=nim> | + | <file nim> |
let xs: array[3, int] = [1, 2, 3] | let xs: array[3, int] = [1, 2, 3] | ||
echo xs #=> [1, 2, 3] | echo xs #=> [1, 2, 3] | ||
- | </codeprism> | + | </file> |
通常の変数の場合と同様に型推論が機能するので、明示的な型の指定は省略することが出来ます。 | 通常の変数の場合と同様に型推論が機能するので、明示的な型の指定は省略することが出来ます。 | ||
- | <codeprism lang=nim> | + | <file nim> |
let a = [1, 2, 3] | let a = [1, 2, 3] | ||
echo a #=> [1, 2, 3] | echo a #=> [1, 2, 3] | ||
- | </codeprism> | + | </file> |
'' | '' | ||
- | <codeprism lang=nim> | + | <file nim> |
var a: array[3, int] | var a: array[3, int] | ||
echo a #=> [0, 0, 0] | echo a #=> [0, 0, 0] | ||
- | </codeprism> | + | </file> |
ゼロ値以外で初期化したい場合の特別な方法はありません。一旦変数を作成してから、for文で設定するのが妥当な方法です。 | ゼロ値以外で初期化したい場合の特別な方法はありません。一旦変数を作成してから、for文で設定するのが妥当な方法です。 | ||
- | <codeprism lang=nim> | + | <file nim> |
var a: array[3, int] | var a: array[3, int] | ||
for x in a.mitems: | for x in a.mitems: | ||
x = 99 | x = 99 | ||
echo a #=> [99, 99, 99] | echo a #=> [99, 99, 99] | ||
- | </codeprism> | + | </file> |
'' | '' | ||
行 41: | 行 41: | ||
配列の宣言には'' | 配列の宣言には'' | ||
- | <codeprism lang=nim> | + | <file nim> |
var a: array[0..2, int] | var a: array[0..2, int] | ||
echo a #=> [0, 0, 0] | echo a #=> [0, 0, 0] | ||
- | </codeprism> | + | </file> |
これはインデックスが0から2の、すなわち、サイズが3の配列を作成します。 | これはインデックスが0から2の、すなわち、サイズが3の配列を作成します。 | ||
行 51: | 行 51: | ||
- | ====== シーケンス | + | ===== シーケンス ===== |
シーケンスは、配列と同様、同じ種類の型の値を保持できる可変長のコンテナです。可変長であることは、作成した後に新たな要素を追加したり削除したり出来ることを意味します。 | シーケンスは、配列と同様、同じ種類の型の値を保持できる可変長のコンテナです。可変長であることは、作成した後に新たな要素を追加したり削除したり出来ることを意味します。 | ||
行 57: | 行 57: | ||
シーケンスの変数の宣言は、型を明示的に書くと次のようになります。 | シーケンスの変数の宣言は、型を明示的に書くと次のようになります。 | ||
- | <codeprism lang=nim> | + | <file nim> |
let xs: seq[int] = @[1, 2, 3] | let xs: seq[int] = @[1, 2, 3] | ||
echo xs #=> @[1, 2, 3] | echo xs #=> @[1, 2, 3] | ||
- | </codeprism> | + | </file> |
型の指定で'' | 型の指定で'' | ||
- | <codeprism lang=nim> | + | <file nim> |
let xs = @[1, 2, 3] | let xs = @[1, 2, 3] | ||
echo xs #=> @[1, 2, 3] | echo xs #=> @[1, 2, 3] | ||
- | </codeprism> | + | </file> |
上の2つの例ではシーケンスの変数の宣言に'' | 上の2つの例ではシーケンスの変数の宣言に'' | ||
- | <codeprism lang=nim> | + | <file nim> |
var xs: seq[int] = @[1, 2, 3] | var xs: seq[int] = @[1, 2, 3] | ||
行 79: | 行 79: | ||
xs.delete(0) | xs.delete(0) | ||
echo xs #=> @[2, 3, 10] | echo xs #=> @[2, 3, 10] | ||
- | </codeprism> | + | </file> |
deleteプロシージャの引数に与えるのは、削除したい要素がシーケンスの何番目であるかを示すインデックスです。シーケンスのインデックスは他の多くの言語と同様に0始まりです。 | deleteプロシージャの引数に与えるのは、削除したい要素がシーケンスの何番目であるかを示すインデックスです。シーケンスのインデックスは他の多くの言語と同様に0始まりです。 | ||
行 85: | 行 85: | ||
シーケンスを作成する別の方法は、newSeqプロシージャを使うことです。 | シーケンスを作成する別の方法は、newSeqプロシージャを使うことです。 | ||
- | <codeprism lang=nim> | + | <file nim> |
var xs = newSeq[int]() | var xs = newSeq[int]() | ||
xs.add(1) | xs.add(1) | ||
行 91: | 行 91: | ||
xs.add(3) | xs.add(3) | ||
echo xs #=> @[1, 2, 3] | echo xs #=> @[1, 2, 3] | ||
- | </codeprism> | + | </file> |
シーケンスに関連するプロシージャは他にもいくつかあります。[[https:// | シーケンスに関連するプロシージャは他にもいくつかあります。[[https:// | ||
- | ====== インデックス | + | ===== インデックス ===== |
配列とシーケンスの要素には'' | 配列とシーケンスの要素には'' | ||
- | <codeprism lang=nim> | + | <file nim> |
let xs = [1, 2, 3, 4, 5] | let xs = [1, 2, 3, 4, 5] | ||
let x0 = xs[0] | let x0 = xs[0] | ||
行 105: | 行 105: | ||
let x1 = xs[1] | let x1 = xs[1] | ||
echo x0 #=> 2 | echo x0 #=> 2 | ||
- | </codeprism> | + | </file> |
インデックスは0始まりです。範囲外アクセスは実行時にチェックされエラーとなります。 | インデックスは0始まりです。範囲外アクセスは実行時にチェックされエラーとなります。 | ||
- | <codeprism lang=nim> | + | <file nim> |
let xs = [1, 2, 3, 4, 5] | let xs = [1, 2, 3, 4, 5] | ||
let x100 = xs[100] | let x100 = xs[100] | ||
- | </codeprism> | + | </file> |
このプログラムを実行すると次のエラーが出力されます。 | このプログラムを実行すると次のエラーが出力されます。 | ||
行 120: | 行 120: | ||
配列は宣言でインデックスの範囲を指定できるので、そうした場合は、取り得るインデックスの範囲はその範囲に制限されます。 | 配列は宣言でインデックスの範囲を指定できるので、そうした場合は、取り得るインデックスの範囲はその範囲に制限されます。 | ||
- | <codeprism lang=nim> | + | <file nim> |
let xs: array[2..6, int]= [1, 2, 3, 4, 5] | let xs: array[2..6, int]= [1, 2, 3, 4, 5] | ||
let x0 = xs[0] # 範囲外アクセス! | let x0 = xs[0] # 範囲外アクセス! | ||
- | </codeprism> | + | </file> |
このプログラムを実行すると次のエラーが出力されます。 | このプログラムを実行すると次のエラーが出力されます。 | ||
行 130: | 行 130: | ||
'' | '' | ||
- | <codeprism lang=nim> | + | <file nim> |
let xs = [1, 2, 3, 4, 5] | let xs = [1, 2, 3, 4, 5] | ||
let x4 = xs[^1] | let x4 = xs[^1] | ||
行 136: | 行 136: | ||
let x3 = xs[^2] | let x3 = xs[^2] | ||
echo x3 #=> 4 | echo x3 #=> 4 | ||
- | </codeprism> | + | </file> |
<WRAP important> | <WRAP important> | ||
行 144: | 行 144: | ||
配列やシーケンスを'' | 配列やシーケンスを'' | ||
- | <codeprism lang=nim> | + | <file nim> |
var xs =[1, 2, 3, 4, 5] | var xs =[1, 2, 3, 4, 5] | ||
xs[0] = 100 | xs[0] = 100 | ||
行 150: | 行 150: | ||
xs[^2] = 400 | xs[^2] = 400 | ||
echo xs #=> [100, 200, 3, 400, 5] | echo xs #=> [100, 200, 3, 400, 5] | ||
- | </codeprism> | + | </file> |
インデックスによるアクセスは'' | インデックスによるアクセスは'' | ||
- | ====== スライス | + | ===== スライス ===== |
'' | '' | ||
- | <codeprism lang=nim> | + | <file nim> |
let xs = [1, 2, 3, 4, 5] | let xs = [1, 2, 3, 4, 5] | ||
let s = xs[1..3] | let s = xs[1..3] | ||
echo s #=> @[2, 3, 4] | echo s #=> @[2, 3, 4] | ||
- | </codeprism> | + | </file> |
- | 出力に'' | + | 出力に'' |
- | <codeprism lang=nim> | + | <file nim> |
let xs = [1, 2, 3, 4, 5] | let xs = [1, 2, 3, 4, 5] | ||
var s = xs[1..3] | var s = xs[1..3] | ||
行 174: | 行 174: | ||
echo s # | echo s # | ||
echo xs #=> [1, 2, 3, 4, 5] | echo xs #=> [1, 2, 3, 4, 5] | ||
- | </codeprism> | + | </file> |
'' | '' | ||
- | <codeprism lang=nim> | + | <file nim> |
var xs = [1, 2, 3, 4, 5] | var xs = [1, 2, 3, 4, 5] | ||
xs[1..3] = [200, 300, 400] # @[200, 300, 400]としても同じ結果になる | xs[1..3] = [200, 300, 400] # @[200, 300, 400]としても同じ結果になる | ||
echo xs #=> [1, 200, 300, 400, 5] | echo xs #=> [1, 200, 300, 400, 5] | ||
- | </codeprism> | + | </file> |
スライスへの代入の挙動には、配列とシーケンスで重要な違いがあります。配列の場合は'' | スライスへの代入の挙動には、配列とシーケンスで重要な違いがあります。配列の場合は'' | ||
- | <codeprism lang=nim> | + | <file nim> |
var xs = [1, 2, 3, 4, 5] | var xs = [1, 2, 3, 4, 5] | ||
xs[1..3] = [200, 300, 400, 500] # 要素数が異なる! | xs[1..3] = [200, 300, 400, 500] # 要素数が異なる! | ||
- | </codeprism> | + | </file> |
このプログラムを実行すると、次のエラーが出力されます。 | このプログラムを実行すると、次のエラーが出力されます。 | ||
行 197: | 行 197: | ||
シーケンスの場合は問題ありません。スライスの範囲が右辺の要素数に合うように置き換えられます。 | シーケンスの場合は問題ありません。スライスの範囲が右辺の要素数に合うように置き換えられます。 | ||
- | <codeprism lang=nim> | + | <file nim> |
var xs = @[1, 2, 3, 4, 5] | var xs = @[1, 2, 3, 4, 5] | ||
xs[1..3] = [200, 300, 400, 500] | xs[1..3] = [200, 300, 400, 500] | ||
行 203: | 行 203: | ||
xs[1..3] = [999] | xs[1..3] = [999] | ||
echo xs # | echo xs # | ||
- | </codeprism> | + | </file> |
スライスは'' | スライスは'' | ||
- | ====== タプル | + | |
+ | ===== タプル ===== | ||
タプルは異なる種類の型の値を保持できる固定長のコンテナです。タプルの変数は次のように宣言することが出来ます。 | タプルは異なる種類の型の値を保持できる固定長のコンテナです。タプルの変数は次のように宣言することが出来ます。 | ||
- | <codeprism lang=nim> | + | <file nim> |
let one: (int, float, string) = (1, 1.0, " | let one: (int, float, string) = (1, 1.0, " | ||
echo one #=> (1, 1.0, " | echo one #=> (1, 1.0, " | ||
- | </codeprism> | + | </file> |
これまでと同様に型推論が機能するので、明示的な型の指定は省略することが出来ます。 | これまでと同様に型推論が機能するので、明示的な型の指定は省略することが出来ます。 | ||
- | <codeprism lang=nim> | + | <file nim> |
let one = (1, 1.0, " | let one = (1, 1.0, " | ||
echo one #=> (1, 1.0, " | echo one #=> (1, 1.0, " | ||
- | </codeprism> | + | </file> |
タプルの各要素にアクセスするには'' | タプルの各要素にアクセスするには'' | ||
- | <codeprism lang=nim> | + | <file nim> |
let one = (1, 1.0, " | let one = (1, 1.0, " | ||
let i = one[0] | let i = one[0] | ||
行 232: | 行 233: | ||
echo f #=> 1.0 | echo f #=> 1.0 | ||
echo s #=> one | echo s #=> one | ||
- | </codeprism> | + | </file> |
タプルを'' | タプルを'' | ||
行 238: | 行 239: | ||
タプルは要素を指すインデックスに名前を付けることが出来ます。これをフィールド名と呼ぶことにします。 | タプルは要素を指すインデックスに名前を付けることが出来ます。これをフィールド名と呼ぶことにします。 | ||
- | <codeprism lang=nim> | + | <file nim> |
let one: tuple[ival: int, fval: float, name: string] = (ival: 1, fval: 1.0, name: " | let one: tuple[ival: int, fval: float, name: string] = (ival: 1, fval: 1.0, name: " | ||
echo one #=> (ival: 1, fval: 1.0, name: " | echo one #=> (ival: 1, fval: 1.0, name: " | ||
- | </codeprism> | + | </file> |
- | やはり、型推論によって明示的な方の指定は省略できます。 | + | やはり、型推論によって明示的な型の指定は省略できます。 |
- | <codeprism lang=nim> | + | <file nim> |
let one = (ival: 1, fval: 1.0, name: " | let one = (ival: 1, fval: 1.0, name: " | ||
echo one #=> (ival: 1, fval: 1.0, name: " | echo one #=> (ival: 1, fval: 1.0, name: " | ||
- | </codeprism> | + | </file> |
各フィールドにアクセスするには'' | 各フィールドにアクセスするには'' | ||
- | <codeprism lang=nim> | + | <file nim> |
let one = (ival: 1, fval: 1.0, name: " | let one = (ival: 1, fval: 1.0, name: " | ||
let i = one.ival | let i = one.ival | ||
行 260: | 行 261: | ||
echo f #=> 1.0 | echo f #=> 1.0 | ||
echo s #=> one | echo s #=> one | ||
- | </codeprism> | + | </file> |
タプルを'' | タプルを'' | ||
+ | |||
+ | ===== その他のコンテナ ===== | ||
+ | |||
+ | これまで見てきたコンテナは、シーケンシャルに順序付けられたコンテナでした。その他のコンテナについても少しだけ触れておきます。 | ||
+ | |||
+ | キーと値のペアを格納するコンテナはテーブル(table)という名前で提供されています((他の言語でマップ(map)や辞書(dictionary)と呼ばれるものです))。テーブルを利用するには、'' | ||
+ | |||
+ | |||
+ | 数学の集合を表すsetが組み込みでサポートされていますが、上記のテーブルの値を持たないバージョンのようなものではなく、もっと限定的なものです。他の言語のsetような用途の広いsetが必要ならば、'' | ||
+ | |||
tutorial/nim/containers.1710153855.txt.gz · 最終更新: 2024/03/11 19:44 by freemikan