クイックスタート¶
このガイドでは、Onionの基本機能を説明して、すぐに使えるようにします。
変数と型¶
Onionは静的型付け言語です。ローカルのval/var宣言では、型注釈を含めるか、初期化子がある場合は省略できます:
// 型注釈付き
val name: String = "Alice"
val age: Int = 30
val price: Double = 19.99
// 型推論(ローカルのみ)
val count = 42 // Intと推論
var greeting = "Hello" // Stringと推論
制御フロー¶
If-Else¶
Whileループ¶
Forループ¶
Foreachループ¶
val names: java.util.List[String] = ["Alice", "Bob", "Charlie"]
foreach name: String in names {
println("こんにちは、" + name)
}
Select文(パターンマッチング)¶
val score: Int = 85
select score {
case 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100:
println("評価: A")
case 80, 81, 82, 83, 84, 85, 86, 87, 88, 89:
println("評価: B")
case 70, 71, 72, 73, 74, 75, 76, 77, 78, 79:
println("評価: C")
else:
println("評価: F")
}
関数¶
基本的な関数¶
def greet(name: String): String = "こんにちは、" + name + "さん!"
val message: String = greet("世界")
println(message)
ラムダ式¶
// ラムダ構文: (params) -> { body }
val add: (Int, Int) -> Int = (x: Int, y: Int) -> { return x + y; }
val result: Int = add.call(5, 3) // 8
println(result)
複数パラメータの関数¶
配列とコレクション¶
配列¶
// 固定サイズ配列
val numbers: Int[] = new Int[5]
numbers[0] = 10
numbers[1] = 20
val colors: String[] = new String[3]
colors[0] = "赤"
colors[1] = "緑"
colors[2] = "青"
// 配列のイテレーション
foreach color: String in colors {
println(color)
}
リスト(ArrayList)¶
import {
java.util.ArrayList;
}
val list: ArrayList[String] = new ArrayList[String]()
list << "最初" // << は追加演算子
list << "2番目"
list << "3番目"
println(list.size) // 3
println(list[0]) // "最初"
クラスとオブジェクト¶
基本的なクラス¶
class Person {
val name: String
var age: Int
public:
def this(n: String, a: Int) {
this.name = n
this.age = a
}
def greet: String = "こんにちは、私は" + this.name + "です"
}
val person: Person = new Person("Alice", 30)
println(person.greet)
ポイント:
- フィールドはthis.fieldでアクセス
- メンバーはデフォルトでprivate
- public:で公開メンバーをマーク
- def thisでコンストラクタを宣言
継承¶
interface Logger {
def log(message: String): void
def count(): Int
}
class BasicLogger <: Logger {
var n: Int
public:
def this { this.n = 0 }
def log(message: String): void {
this.n = this.n + 1
println(message)
}
def count(): Int = n
}
// `forward` は Logger インターフェースを `delegate` への委譲で自動実装します。
class PrefixLogger <: Logger {
forward val delegate: Logger
public:
def this(delegate: Logger) {
this.delegate = delegate
}
}
構文:
- class Child : Parent - クラスを継承
- class Impl <: Interface - インターフェースを実装
- class Multi : Parent <: Interface - 両方
- forward val m: Interface - Interface を m への委譲で自動実装
Java相互運用¶
OnionはJavaライブラリにシームレスにアクセスできます:
import {
java.io.File;
javax.swing.JFrame;
javax.swing.JButton;
}
val frame: JFrame = new JFrame("マイウィンドウ")
frame.setSize(400, 300)
frame.setVisible(true)
val file: File = new File("data.txt")
if file.exists {
println("ファイルが存在します!")
}
よく使うJavaクラス¶
// Math操作
val random: Double = Math::random()
val sqrt: Double = Math::sqrt(16.0)
// 文字列操作
val upper: String = "hello".toUpperCase()
val length: Int = "hello".length
// パース
val num: Int = JInteger::parseInt("42")
例外処理¶
try {
val value: Int = JInteger::parseInt("数字じゃない")
println(value)
} catch e: NumberFormatException {
println("無効な数値形式: " + e.getMessage)
}
型キャスト¶
型キャストにはasキーワードを使用します。メソッドチェインの場合は括弧が必要です:
val random: Double = Math::random()
val randomInt: Int = (random * 100) as Int
val obj: Object = "Hello"
val str: String = obj as String
// メソッドチェインの場合は括弧が必要
val btn: Object = getButton()
val text: String = (btn as JButton).getText()
モジュールシステム¶
// Javaクラスをインポート
import {
java.util.ArrayList;
java.util.HashMap;
java.io.File;
}
// インポートなしで完全修飾名を使用
val list: java.util.ArrayList[String] = new java.util.ArrayList[String]()