このページの内容

値

値は、ほかのすべてのオブジェクトの構成要素となる、組み込みの基本的なオブジェクト型です。値を評価結果として得る式であるリテラルを使って作成できます。すべての値は不変で、一度作成すると変わりません。数値3は常に数値3です。文字列"frozen"の文字配列を、その場で変更することはできません。

真偽値 #

真偽値は真または偽を表します。真偽値リテラルはtrueとfalseの二つです。そのクラスはBoolです。

数値 #

ほかのスクリプト言語と同じように、Wrenの数値型は倍精度浮動小数点数の一種類です。数値リテラルは、ほかの言語を使ってきた人が予想するような形をしています。


0
1234
-5678
3.14159
1.0
-12.34
0.0314159e02
0.0314159e+02
314.159e-02
0xcaffe2

数値はNumクラスのインスタンスです。

文字列 #

文字列はバイトの配列です。通常はUTF-8で符号化した文字を保存しますが、ゼロや不正なUTF-8列を含め、どんなバイト値でも入れられます。(ただし、後者を端末に表示するのは難しいかもしれません。)

文字列リテラルは二重引用符で囲みます。


"hi there"

複数行にまたがることもできます。


"hi
there,
again"

エスケープ #

いくつかのエスケープ文字をサポートしています。


"\0" // The NUL byte: 0.
"\"" // A double quote character.
"\\" // A backslash.
"\%" // A percent sign.
"\a" // Alarm beep. (Who uses this?)
"\b" // Backspace.
"\e" // ESC character.
"\f" // Formfeed.
"\n" // Newline.
"\r" // Carriage return.
"\t" // Tab.
"\v" // Vertical tab.


"\x48"        // Unencoded byte     (2 hex digits)
"\u0041"      // Unicode code point (4 hex digits)
"\U0001F64A"  // Unicode code point (8 hex digits)

\xに続けて16進数の数字を二桁書くと、文字の符号化を行わず、単一のバイトを指定できます。


System.print("\x48\x69\x2e") //> Hi.

\uに続けて16進数の数字を四桁書くと、Unicodeコードポイントを指定できます。


System.print("\u0041\u0b83\u00DE") //> AஃÞ

大文字の\Uに続けて16進数の数字を八桁書くと、欠かせない絵文字など、基本多言語面の外にあるUnicodeコードポイントを指定できます。


System.print("\U0001F64A\U0001F680") //> 🙊🚀

文字列はStringクラスのインスタンスです。

文字列補間 #

文字列リテラルでは補間も使えます。パーセント記号(%)の後に丸括弧で囲んだ式を書くと、その式が評価されます。結果のオブジェクトのtoStringメソッドを呼び出し、その結果を文字列に挿入します。


System.print("Math %(3 + 4 * 5) is fun!") //> Math 23 is fun!

丸括弧の中には、どれほど複雑な式でも書けます。


System.print("wow %((1..3).map {|n| n * n}.join())") //> wow 149

補間する式には、さらに独自の補間を入れ子にした文字列リテラルを含めることもできます。ただし、そうするとすぐに読みにくくなります。

raw文字列 #

三重引用符"""を使って文字列リテラルを作ることもでき、この場合はraw文字列として解析します。raw文字列も、ほかの文字列と違いはありません。解析の仕方が違うだけです。

raw文字列ではエスケープを処理せず、補間も一切行いません。


"""hi there"""

raw文字列が複数行にまたがり、三重引用符がそれだけの行にある場合、その行の空白は無視します。つまり、三重引用符を別の行に置き、それ以外が空白(スペースとタブ)だけなら、開始行と終了行は文字列の一部として数えません。


  """
    Hello world
  """

上の例で得られる文字列の値には、改行も末尾の空白もありません。Helloの前にあるスペースは保持される点に注意してください。


    Hello world

raw文字列は、ファイルに書かれたとおりに、変更せず解析します。つまり、引用符、不正な構文、ほかのデータ形式などを含めても、Wrenによって変更されません。


"""
  {
    "hello": "wren",
    "from" : "json"
  }
"""

もう一つの例として、文字列にWrenのコードを安全に埋め込みます。


"""
A markdown string with embedded wren code example.

    class Example {
      construct code() {
        //
      }
    }
"""

範囲 #

範囲は、連続する数値の範囲を表す小さなオブジェクトです。専用のリテラル構文はありません。代わりに、数値クラスが範囲を作る..と...の演算子を実装しています。


3..8

これで、8そのものも含む3から8までの範囲を作成します。片側の端点だけを含む範囲にしたい場合は、...を使います。


4...6

これは、6そのものを含まない4から6までの範囲を作成します。範囲は、数値の列を反復処理する際によく使いますが、ほかにも用途があります。例えば、リストの添字演算子に渡すとリストの一部分を、Stringに渡すとその範囲の部分文字列を返します。


var list = ["a", "b", "c", "d", "e"]
var slice = list[1..3]
System.print(slice) //> [b, c, d]

var string = "hello wren"
var wren = string[-4..-1]
System.print(wren) //> wren

そのクラスはRangeです。

Null #

Wrenには特別な値nullがあり、これはNullクラスの唯一のインスタンスです。(大文字と小文字の違いに注意してください。)一部の言語のvoidに似た働きをし、値がないことを表します。何も返さないメソッドを呼び出して戻り値を取得すると、nullが返ります。



リスト →← 構文