Ring 1.8 での変更点は?¶
Ring 1.8 公開版の新機能と変更点を学びます。
新機能と変更一覧¶
Ring 1.8 の新機能!
- 実行性能の改善
- Find in files アプリケーション
- String2Constant アプリケーション
- StopWatch アプリケーション
- そのほかの 3D サンプル
- Manjaro Linux でのコンパイル
- クラス範囲で This を Self として使用
- オブジェクト属性のデフォルト値は NULL
- For ループでローカルスコープを使用
- バイナリ文字の統合
- FoxRing ライブラリ
- フォームデザイナーの改善
- Cards ゲームの改善
- RingQt の改善
- 拡張機能用コード生成器の改善
- Ring コンパイラと VM の改善
- 拡張機能開発者への告知
実行性能の改善¶
Ring 1.8 は Ring 1.7 よりも高速化されました。
実行性能の利得はアプリケーションによりますが 10 ~ 100% ほどです。
この公開版において、現在の実行性能の関する考えかたを理解するには、 3D サンプルをご確認ください。
詳細情報は「性能改善に関する情報」をお読みください。
String2Constant アプリケーション¶
Ring 1.8 より String2Constant アプリケーションがあります。
このツールは文字列リテラルではなく、定数を使用したソースコードへ変換します。
これにより、定数を様々な言語を翻訳して言語ごとにソースコードのファイルへ格納できます。
Arabic.ring, English.ring, Japanese.ring など言語ごとに特殊なファイルを扱えます。
このツールの採用事例としては、アラビア語へ翻訳したフォームデザイナーがあります。
詳細情報は「多国語アプリケーション」をお読みください。

そのほかの 3D サンプル¶
サンプルは ring/samples/3D フォルダにあります。
このスクリーンショットはトップダウン - 多層立方体のサンプルです。

このスクリーンショットはカメラのサンプルです。

このスクリーンショットはカメラと背景のサンプルです。
開発者 : アズディン・レマル

クラス範囲で This を Self として使用¶
クラス範囲とはクラス名の後、およびすべてのメソッドの前に出現する範囲のことです。
クラス範囲で This を Self として使用できます。
用例:
func main
o1 = new program {
test()
}
? o1
class program
this.name = "My Application"
this.version = "1.0"
? name ? version
func test
? "Name = " + name
? "Version = " + version
実行結果:
My Application
1.0
Name = My Application
Version = 1.0
name: My Application
version: 1.0
注釈
弓括弧を使用すると現在の有効なオブジェクトを変更しますが、This を使用するとクラスを指したままにできます。
情報
This と Self には違いがあります。 Self が指している現在の有効なオブジェクトは弓括弧で変更できます。
ほとんどの場合、クラス範囲で This あるいは Self を使う必要はないことを覚えていてください。
このように記述することもできます。
class program name version
または
class program name="My Application" version="1.0"
注釈
同名で定義されたグローバル変数との衝突を回避するために、クラス範囲で This あるいは Self を使用します。
オブジェクト属性のデフォルト値¶
オブジェクト属性のデフォルト値は NULL です。
Ring では、 NULL 値は空文字列または “NULL” を有する文字列です。
NULL 値の検査には isNULL() 関数を使用します。
用例:
oProgram = new Program
? oProgram.name
? oProgram.version
? isNULL(oProgram.name)
? isNULL(oProgram.version)
oProgram { name="My Application" version="1.0" }
? isNULL(oProgram.name)
? isNULL(oProgram.version)
? oProgram
class program
name
version
実行結果:
NULL
NULL
1
1
0
0
name: My Application
version: 1.0
以前の Ring バージョンでは、値の割り当て前にオブジェクトの属性へアクセスを試みていました。
これはランタイムエラーとなり isNULL() でも検出できません。
唯一の方法は値の割り当て、または try/catch/end を使用することです。
この挙動を変更しており、つなぎ目のない完全な制御を扱うことができます。
For ループでローカルスコープを使用¶
Ring 1.8 より、 For ループでの新規識別子 (変数) を定義するときは、ローカルスコープで定義します。
用例:
x = 10
? x # 10 の表示
test1()
? x # 10 の表示
test2()
? x # 10 の表示
func test1
for x = 1 to 5
next
? x # 6 の表示
func test2
list = 1:5
for x in list
next
? x # NULL の表示 ("For In" ループでは、ループ完了後に参照を破棄します)
実行結果:
10
6
10
NULL
10
バイナリ文字の統合¶
Ring 1.0 からバイナリ文字列の作成と操作に対応しました。
Ring 1.8 より文字列から個別に文字を取得したり、 ‘+’ 演算子を使用してまとめて統合できます。
用例:
cStr = "Welcome"
? cstr[1] + cstr[2] + cStr[5]
v = cstr[1] + cstr[2] + cStr[5]
? v
? len(v)
c1 = cStr[1]
? c1
aList = [1,2,3]
cStr = ""
for item in aList
cStr += int2bytes(item)
next
? "All String"
? len(cStr)
? "First Part"
n1 = cStr[1] + cStr[2] + cStr[3] + cStr[4]
? len(n1)
? "Second Part"
n2 = cStr[5] + cStr[6] + cStr[7] + cStr[8]
? len(n2)
? "Third Part"
n3 = cStr[9] + cStr[10] + cStr[11] + cStr[12]
? len(n3)
? "All String"
cString = cStr[1] + cStr[2] + cStr[3] + cStr[4] +
cStr[5] + cStr[6] + cStr[7] + cStr[8] +
cStr[9] + cStr[10] + cStr[11] + cStr[12]
? len(cString)
? ascii(cStr[1])
? len(cStr[2])
実行結果:
Weo
Weo
3
W
All String
12
First Part
4
Second Part
4
Third Part
4
All String
12
1
1
FoxRing ライブラリ¶
開発者: ホセ・ロサード
FoxPro の関数を使用したクラスです。
用例:
Load "foxring.ring"
mf = new frFunctions
? mf.frAbs(-45)
? mf.frAbs(10-30)
? mf.frAbs(30-10)
? mf.frTransform(" Ring is a good language ",
"@! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
? mf.frAllTrim(" Ring is a good language ", Null)
実行結果:
45
20
20
RING IS A GOOD LANGUAGE
Ring is a good language
フォームデザイナーの改善¶
- Layout コントロール - フォームの読み込み時にコントロール名を表示。
- Button コントロール - 相対パスを使用して記述された画像ボタンを表示。
- Table コントロール - フォームの読み込み時にコントロール名を表示。
- “Bring to front” (前面へ移動) と “Send to back” (後面へ移動) 操作の挙動を改善。
- 新しいボタンをツールバーへ追加 (複製、前面へ移動、後面へ移動、削除)。
- 「メニューバーデザイナー、ウィンドウフラグのウィンドウ、オブジェクトウィンドウの選択」でのレイアウトを使用。
- 選択されたオブジェクトを変更するときにプロパティウィンドウの表示挙動を改善。
- オブジェクトの複数選択で移動と寸法変更の新しいボタンを追加。
- オブジェクトのプロパティ - レイアウト選択ボタンの追加。
- フォームを開く、およびファイルの切り換えを高速化。
- オブジェクトの順序ウィンドウ。
- オブジェクトのウィンドウを選択。
- コントロール名を変更するとき、名前はレイアウトオブジェクトを更新します。
RingQt の改善¶
- このクラスを RingQt へ追加しました。
- QTabBar
- QFile
- QFileDevice
- QStandardPaths
- QDir
- QQuickWidget
- QQmlError
- QScrollBar
- 現行版の Qt へ対応するために Android 版 RingQt を更新をしました。
検証に使用したもの:
- Qt 5.5.1
- Qt 5.9.5
- Qt 5.11.0
- Android 版 RingQt では、リソースから Ring オブジェクトファイル (*.ringo) を直接実行できます。
拡張機能用コード生成器の改善¶
新しいオプション: StaticMethods
Ring 1.8 からコード生成器は staticmethods オプションに対応しました。
これにより、コード生成器はクラスでメソッドを呼び出すためのオブジェクトの準備は不要であることを検出できるようになりました。
用例:
<class>
name: QStandardPaths
para: void
nonew
staticmethods
</class>
QString displayName(QStandardPaths::StandardLocation type)
QString findExecutable(QString executableName, QStringList paths))
Ring コンパイラと VM の改善¶
- 相対パス指定のファイル読み込みを改善
- eval() 関数関連のコードを最適化
- メモリプールの改善
- Ring へ Ring を組み込んだときに、ゲスト環境でエラーが発生してもホストは異常終了しなくなりました。
用例:
? "Start the test!"
pState = ring_state_init()
ring_state_runcode(pState," ? 'Let us try having an error' ? x")
ring_state_delete(pState)
? ""
? "End of test!"
実行結果:
Start the test!
Let us try having an error
Line 1 Error (R24) : Using uninitialized variable : x
in file Ring_EmbeddedCode
End of test!
- コンパイラは、キーワードの後にくる行をトークンとみなして無視するようになりました。
用例:
see
"
Hello, World!
"
test()
func
#======================#
Test
#======================#
?
"
Hello from the Test function
"
実行結果:
Hello, World!
Hello from the Test function
- メインループ、 eval() 関数の特殊なループに関するコードの改善 (高速化)
- NULL ポインタの使用回避用の追跡用 C ポインタの改善 (高速化)
- 弓括弧を使用した Self オブジェクトの取得を改善 (高速化)
拡張機能開発者への告知¶
新たに Ring の拡張機能を C/C++ 言語で作成したときは
Ring 1.8 での使用前に拡張機能を再ビルドしてください (Ring 1.8 添付のヘッダファイルで DLL ファイルを再生成)。
これは仮想計算機の内部構造変更による影響です。再ビルドのみ必要であり、コードの変更は一切不要です。