長さ#
配列的オブジェクトには長さの概念が定義されます。
長さの定義#
長さの定義は値のタイプによって異なります。
| タイプ | 長さの定義 |
|---|---|
| 文字列 | UTF-16コード単位の個数 |
| 配列 | 要素数 |
| オブジェクト | 親オブジェクトを無視したエントリの数 |
| BLOB | バイト数 |
| ストリーム | 各要素の長さの合計 |
長さは何らかの数値として定義されますが、整数であるとは限りません。
長さ取得演算子 $#array#
長さ取得演算子 $#array は値の長さを取得します。
$ xa '$#"123"'
# 3
$ xa '$#[1, 2, 3]'
# 3
$ xa '$#{a: 1; b: 2; c: 3}'
# 3
$ xa '$#BLOB.of([1, 2, 3])'
# 3
$ xa '$#("abc", "def", "ghi")'
# 9
長さ取得演算子のオーバーライド#
長さの取得は値の $#_ メソッドを呼び出すことで行われます。
$#_ メソッドをオーバーライドすることで長さの取得の処理を変更することができます。
$ xa '
Object := {
`$#_`: this -> this.length
}
object := Object{length: 123}
$#object
'
# 123
長さは小数値であってもかまいません。
$ xa '
Line := {
`$#_`: this -> ((this.b.0 - this.a.0) ^ 2 + (this.b.1 - this.a.1) ^ 2) ^ 0.5
}
object := Line{
a: [1, 2]
b: [2, 3]
}
"$%.4f($#object)"
'
# 1.4142