1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5 <html xmlns="http://www.w3.org/1999/xhtml">
7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9 <title>変数と属性のスコープ規則 — プログラミング言語 Ring 1.12 取扱説明書</title>
11 <link rel="stylesheet" href="_static/bootstrap-astropy.css" type="text/css" />
12 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
14 <script type="text/javascript">
15 var DOCUMENTATION_OPTIONS = {
18 COLLAPSE_INDEX: false,
23 <script type="text/javascript" src="_static/jquery.js"></script>
24 <script type="text/javascript" src="_static/underscore.js"></script>
25 <script type="text/javascript" src="_static/doctools.js"></script>
26 <script type="text/javascript" src="_static/translations.js"></script>
27 <link rel="top" title="プログラミング言語 Ring 1.12 取扱説明書" href="index.html" />
28 <link rel="next" title="関数とメソッドのスコープ規則" href="scope2.html" />
29 <link rel="prev" title="Qt3D の用法" href="qt3d.html" />
30 <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
33 <body role="document">
35 <a class="brand" title="Documentation Home" href="index.html"><span id="logotext1">🍩Ring</span><span id="logotext2"> 1.12</span><span id="logotext3">:docs</span></a>
38 <li><a href="http://ring-lang.sourceforge.net/news.html">News</a></li>
39 <li><a href="http://ring-lang.sourceforge.net/download.html">Download</a></li>
40 <li><a href="https://groups.google.com/forum/#!forum/ring-lang">Get Help</a></li>
41 <li><a href="https://github.com/ring-lang/ring">Contribute</a></li>
42 <li><a href="http://ring-lang.sourceforge.net/resources.html">Resources</a></li>
43 <li><a href="http://ring-lang.sourceforge.net/team.html">Team</a></li>
45 <li><a title="Ring Homepage" href="http://ring-lang.net/">Website</a></li>
46 <li><a title="総合索引" href="genindex.html">Index</a></li>
50 <form action="search.html" method="get">
51 <input type="text" name="q" placeholder="Search" />
52 <input type="hidden" name="check_keywords" value="yes" />
53 <input type="hidden" name="area" value="default" />
64 <a href="scope2.html" title="関数とメソッドのスコープ規則">
69 <a href="qt3d.html" title="Qt3D の用法">
75 <a href="index.html">プログラミング言語 Ring 1.12 取扱説明書</a>
84 <div class="document">
85 <div class="documentwrapper">
86 <div class="bodywrapper">
87 <div class="body" role="main">
89 <div class="section" id="index-0">
90 <span id="id1"></span><h1>変数と属性のスコープ規則<a class="headerlink" href="#index-0" title="このヘッドラインへのパーマリンク">¶</a></h1>
91 <p>Ring のスコープ規則と変数の検出方法、および名前衝突の解説、さらに解決方法と回避方法を学びます。</p>
92 <p>この情報は Ring で大規模アプリケーションの開発をはじめるときに重要です。</p>
93 <p>アプリケーションには下記が使用されています。</p>
95 <li>グローバル変数 (使用を避けることに努めてください)</li>
96 <li>クラス (オブジェクト指向)</li>
97 <li>括弧 { } によるオブジェクトのアクセス</li>
101 <div class="section" id="index-1">
102 <span id="id2"></span><h2>三種類のスコープ<a class="headerlink" href="#index-1" title="このヘッドラインへのパーマリンク">¶</a></h2>
103 <p>Ring には三種類のスコープがあります。</p>
104 <ol class="arabic simple">
105 <li>パブリックスコープとグローバルスコープ - 各変数はステートメント部で定義されます (関数とクラスの前)</li>
106 <li>オブジェクトスコープ - オブジェクトの内側にあるとき (クラスのメソッドの内側または { } の使用によるオブジェクトへのアクセス)</li>
107 <li>ローカルスコープ - 関数とメソッドに関連付けられています</li>
110 <div class="section" id="index-2">
111 <span id="id3"></span><h2>変数の定義と変数へのアクセス<a class="headerlink" href="#index-2" title="このヘッドラインへのパーマリンク">¶</a></h2>
112 <ol class="arabic simple">
113 <li>Ring はレキシカルスコープを使用しています。つまり、変数のスコープは変数を定義した場所により決定します。</li>
114 <li>{ } 括弧内でのオブジェクトのアクセス時、現在有効なオブジェクトのスコープを対象となるオブジェクトのスコープへ変更します。今まで通り、グローバルスコープとローカルスコープへアクセスできます。</li>
115 <li>‘Class’ キーワードとクラス名末尾に、変数名の定義を記述したとしても、今まで通りグローバルスコープへアクセスできます。</li>
117 <p>この範囲 (クラスの範囲 - クラス名の後、およびメソッドの前) にあるものは、</p>
119 <div><ul class="simple">
120 <li>グローバルスコープ —-> グローバルスコープ</li>
121 <li>オブジェクトスコープ —-> オブジェクトスコープ</li>
122 <li>ローカルスコープ —-> オブジェクトスコープ</li>
125 <div class="admonition note">
126 <p class="first admonition-title">注釈</p>
127 <p class="last">クラスの範囲にあるローカルスコープからでも、この範囲のオブジェクトスコープを指すため、入れ子の括弧は使用可能でありローカルスコープからクラスのオブジェクトスコープへのアクセスができます。</p>
129 <div class="admonition tip">
130 <p class="first admonition-title">情報</p>
131 <p class="last">この範囲での定義によりウィンドウとコントロールの属性を作成できます。</p>
133 <div class="admonition tip">
134 <p class="first admonition-title">情報</p>
135 <p class="last">クラスの範囲にてオブジェクトの作成、および括弧 { } でオブジェクトへアクセスした後に、括弧の内側で Self.属性 を使うとクラスを使えます (アクセスしようとしているオブジェクトではありません)。この理由はローカルスコープからクラスを呼び出すことができるからです。</p>
137 <ol class="arabic simple" start="4">
138 <li>関数の仮引数は、自動的にローカルスコープへ定義されます。</li>
141 <div class="section" id="ring">
142 <span id="index-3"></span><h2>Ring による変数の検出方法<a class="headerlink" href="#ring" title="このヘッドラインへのパーマリンク">¶</a></h2>
143 <p>1 - 最初にローカルスコープを検索</p>
147 <p>2 - オブジェクトスコープの検索</p>
151 <p>3 - パブリックスコープの検索</p>
153 <li>見つからない —-> ランタイムエラー</li>
154 <li>見つかった —-> 次回の検索を回避するために、最適化できるかどうか確認します (性能改善のためのポインタとキャッシュ)。</li>
157 <div class="section" id="index-4">
158 <span id="id4"></span><h2>オブジェクト.属性の用法<a class="headerlink" href="#index-4" title="このヘッドラインへのパーマリンク">¶</a></h2>
159 <p>オブジェクト.属性 を使うときはオブジェクト属性に限り検索を行います。</p>
160 <p>つまり、ローカルスコープまたはグローバルスコープのオブジェクト属性では検索は行いません。</p>
161 <div class="admonition note">
162 <p class="first admonition-title">注釈</p>
163 <p class="last">Self.属性を使うときは属性を検索する前に Self の検索を最初に行います。</p>
166 <div class="section" id="self">
167 <span id="index-5"></span><h2>Self オブジェクト<a class="headerlink" href="#self" title="このヘッドラインへのパーマリンク">¶</a></h2>
168 <p>Selft オブジェクトは現在のオブジェクトを参照するためにクラスのメソッドから使えます!</p>
169 <p>クラスのメソッドの内側であり Self を使うときは、このクラスから作成されるオブジェクトを意味します。</p>
170 <p>クラスのメソッドの内側で括弧 { } を使うと、現在のオブジェクトのスコープを変更します。
171 また、 Self でオブジェクトへアクセスするときに、括弧の内側にある参照を変更します。</p>
172 <p>クラスの範囲 (クラス名の後、およびメソッドの前) の内側はオブジェクトスコープ、
173 およびローカルスコープからオブジェクトへのアクセスすることもできます。
174 この範囲で Self を使うと、常にクラスのオブジェクトへ参照されます。
175 オブジェクトのスコープの変更で括弧を使用後に、括弧の内側で Self を使用した場合でも、
176 クラスの範囲内にあるため、 Self はクラスオブジェクトへの参照になります (既に括弧でアクセスしているオブジェクトではありません)。</p>
178 <li>グローバルスコープ —> グローバルスコープ</li>
179 <li>オブジェクトスコープ —> オブジェクトスコープ</li>
180 <li>ローカルスコープ —> オブジェクトスコープ</li>
182 <p>括弧を使うとオブジェクトのスコープのみ変更されます。
183 Ring は変数を検索するときに、ローカルスコープを最初に検索するためクラスの内側にある Self を検出します。</p>
185 <div class="section" id="index-6">
186 <span id="id5"></span><h2>Ring における変数と属性の定義方法<a class="headerlink" href="#index-6" title="このヘッドラインへのパーマリンク">¶</a></h2>
187 <p>Ring は代入操作で変数名を使用します。</p>
189 <p>2 - 見つからない —> ランタイムエラーの回避と現在のスコープへ変数を定義します。</p>
190 <p>3 - 見つかった —> 変数を使用しますが現在のスコープへ変数を一切定義しません。</p>
192 <li>グローバルの範囲 (関数またはクラスの前) において現在のスコープはグローバルスコープになります。</li>
193 <li>クラスの範囲 (クラス名の後、およびメソッドの前) において現在のスコープはオブジェクトの属性になります。</li>
194 <li>関数とメソッドにおける現在のスコープはローカルスコープになります。</li>
197 <div class="section" id="index-7">
198 <span id="id6"></span><h2>クラス属性とグローバル変数の間での名前衝突<a class="headerlink" href="#index-7" title="このヘッドラインへのパーマリンク">¶</a></h2>
199 <p>この用例を参照してください:</p>
200 <div class="highlight-ring"><div class="highlight"><pre><span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
201 <span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">person</span>
202 <span class="k">see</span> <span class="n">o1</span>
204 <span class="k">class</span> <span class="n">person</span>
205 <span class="n">name</span>
206 <span class="n">address</span>
207 <span class="n">phone</span>
210 <p>前述の用例ではグローバル変数 ‘name’ が
211 person クラスの内側にあります。</p>
212 <p>Ring は‘name’ 変数を使用するにとき検索処理の開始、
214 <p>見つかった —> 見つかったものを使用</p>
215 <p>見つからない —> 新しい属性の定義</p>
216 <p>しかし、変数名はグローバル変数であるため、検出後に使用されます!</p>
217 <p>属性名が存在しない! オブジェクトへ追加します。</p>
218 <p>解決方法① - Main 関数の使用</p>
219 <div class="highlight-ring"><div class="highlight"><pre><span class="k">func</span> <span class="n">main</span>
220 <span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
221 <span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">person</span>
222 <span class="k">see</span> <span class="n">o1</span>
224 <span class="k">class</span> <span class="n">person</span>
225 <span class="n">name</span>
226 <span class="n">address</span>
227 <span class="n">phone</span>
230 <p>解決方法② - $ などのグローバル変数名に特殊記号を使用</p>
231 <div class="highlight-ring"><div class="highlight"><pre><span class="o">$</span><span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
232 <span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">person</span>
233 <span class="k">see</span> <span class="n">o1</span>
235 <span class="k">class</span> <span class="n">person</span>
236 <span class="n">name</span>
237 <span class="n">address</span>
238 <span class="n">phone</span>
241 <p>解決方法③ - AddAttribute() メソッドの使用</p>
242 <div class="highlight-ring"><div class="highlight"><pre><span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
243 <span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">person</span>
244 <span class="k">see</span> <span class="n">o1</span>
246 <span class="k">class</span> <span class="n">person</span>
247 <span class="n">AddAttribute</span><span class="p">(</span><span class="n">self</span><span class="p">,</span><span class="s">"name"</span><span class="p">)</span>
248 <span class="n">address</span>
249 <span class="n">phone</span>
252 <p>解決方法④ - 属性名の先頭に Self を使用</p>
253 <div class="highlight-ring"><div class="highlight"><pre><span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
254 <span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">person</span>
255 <span class="k">see</span> <span class="n">o1</span>
257 <span class="k">class</span> <span class="n">person</span>
258 <span class="n">self</span><span class="p">.</span><span class="n">name</span>
259 <span class="n">address</span>
260 <span class="n">phone</span>
263 <p>この名前衝突に関する最善の解決方法は?</p>
264 <p>1 - グローバル変数で $ 記号を使用</p>
265 <p>2 - オプション扱い : グローバル変数の回避する、または Main 関数の使用</p>
269 <li>属性名の先頭に Self を使います。または AddAttribute() を使用します。</li>
272 <div class="section" id="index-8">
273 <span id="id7"></span><h2>クラス属性とローカル変数の間での名前衝突<a class="headerlink" href="#index-8" title="このヘッドラインへのパーマリンク">¶</a></h2>
274 <p>この名前衝突は、括弧でオブジェクトにアクセスするときに発生します。</p>
276 <div class="highlight-ring"><div class="highlight"><pre><span class="k">func</span> <span class="n">main</span>
277 <span class="n">name</span> <span class="o">=</span> <span class="s">"nice"</span>
278 <span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">person</span> <span class="p">{</span><span class="n">name</span><span class="o">=</span><span class="s">"mahmoud"</span> <span class="n">address</span><span class="o">=</span><span class="s">"Egypt"</span> <span class="n">phone</span> <span class="o">=</span> <span class="mi">000</span> <span class="p">}</span>
279 <span class="k">see</span> <span class="n">o1</span>
281 <span class="k">class</span> <span class="n">person</span>
282 <span class="n">name</span>
283 <span class="n">address</span>
284 <span class="n">phone</span>
287 <p>前述の用例にはローカル変数名があります。</p>
288 <p>この変数の値は、オブジェクトの属性ではなく“mahmoud”が設定されます。</p>
289 <p>解決方法① : Self の使用</p>
290 <div class="highlight-ring"><div class="highlight"><pre><span class="k">func</span> <span class="n">main</span>
291 <span class="n">name</span> <span class="o">=</span> <span class="s">"nice"</span>
292 <span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">person</span> <span class="p">{</span><span class="n">self</span><span class="p">.</span><span class="n">name</span><span class="o">=</span><span class="s">"mahmoud"</span> <span class="n">address</span><span class="o">=</span><span class="s">"Egypt"</span> <span class="n">phone</span> <span class="o">=</span> <span class="mi">000</span> <span class="p">}</span>
293 <span class="k">see</span> <span class="n">o1</span>
295 <span class="k">class</span> <span class="n">person</span>
296 <span class="n">name</span>
297 <span class="n">address</span>
298 <span class="n">phone</span>
301 <p>解決方法② : ローカル変数名の変更</p>
302 <div class="highlight-ring"><div class="highlight"><pre><span class="k">func</span> <span class="n">main</span>
303 <span class="n">cName</span> <span class="o">=</span> <span class="s">"nice"</span>
304 <span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">person</span> <span class="p">{</span><span class="n">name</span><span class="o">=</span><span class="s">"mahmoud"</span> <span class="n">address</span><span class="o">=</span><span class="s">"Egypt"</span> <span class="n">phone</span> <span class="o">=</span> <span class="mi">000</span> <span class="p">}</span>
305 <span class="k">see</span> <span class="n">o1</span>
307 <span class="k">class</span> <span class="n">person</span>
308 <span class="n">name</span>
309 <span class="n">address</span>
310 <span class="n">phone</span>
313 <p>解決方法③ : 括弧の変更およびドット演算子を使用</p>
314 <div class="highlight-ring"><div class="highlight"><pre><span class="k">func</span> <span class="n">main</span>
315 <span class="n">name</span> <span class="o">=</span> <span class="s">"nice"</span>
316 <span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">person</span>
317 <span class="n">o1</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span><span class="s">"mahmoud"</span>
318 <span class="n">o1</span><span class="p">.</span><span class="n">address</span> <span class="o">=</span><span class="s">"Egypt"</span>
319 <span class="n">o1</span><span class="p">.</span><span class="n">phone</span> <span class="o">=</span> <span class="mi">000</span>
320 <span class="k">see</span> <span class="n">o1</span>
322 <span class="k">class</span> <span class="n">person</span>
323 <span class="n">name</span>
324 <span class="n">address</span>
325 <span class="n">phone</span>
329 <div class="section" id="index-9">
330 <span id="id8"></span><h2>括弧によるクラスのメソッドの内側にあるオブジェクトへのアクセス方法<a class="headerlink" href="#index-9" title="このヘッドラインへのパーマリンク">¶</a></h2>
331 <p>クラスのメソッドの内側では三種類のスコープ (ローカルスコープ、オブジェクトスコープとグローバルスコープ) があることを思い出してください。
332 これはオブジェクト属性とメソッドへアクセス可能であると期待しており、
333 括弧でオブジェクトの属性とメソッドへアクセスするまでは本当です。
334 この場合は、オブジェクトのスコープが別のオブジェクトへ切り替えられるためです。</p>
335 <div class="highlight-ring"><div class="highlight"><pre><span class="k">new</span> <span class="n">point</span> <span class="p">{</span> <span class="n">test</span><span class="p">()</span> <span class="p">}</span>
337 <span class="k">class</span> <span class="n">point</span>
338 <span class="n">x</span><span class="o">=</span><span class="mi">10</span> <span class="n">y</span><span class="o">=</span><span class="mi">20</span>
339 <span class="k">func</span> <span class="n">test</span>
340 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 正常に動作します。</span>
341 <span class="n">myobj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">otherclass</span> <span class="p">{</span>
342 <span class="k">see</span> <span class="n">name</span> <span class="o">+</span> <span class="n">nl</span>
343 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># エラー!</span>
344 <span class="p">}</span>
346 <span class="k">class</span> <span class="n">otherclass</span>
347 <span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
351 <div class="highlight-none"><div class="highlight"><pre>10
355 Line 8 Error (R24) : Using uninitialized variable : x
356 In method test() in file methodbraceerror.ring
357 called from line 5 in file methodbraceerror.ring
360 <p>さて、前述の問題の解決方法は?</p>
361 <p>解決方法 (1) : 括弧の外側にあるクラスの属性へアクセスするためのコードを記述する。</p>
362 <div class="highlight-ring"><div class="highlight"><pre><span class="k">new</span> <span class="n">point</span> <span class="p">{</span> <span class="n">test</span><span class="p">()</span> <span class="p">}</span>
364 <span class="k">class</span> <span class="n">point</span>
365 <span class="n">x</span><span class="o">=</span><span class="mi">10</span> <span class="n">y</span><span class="o">=</span><span class="mi">20</span>
366 <span class="k">func</span> <span class="n">test</span>
367 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 正常に動作します。</span>
368 <span class="n">myobj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">otherclass</span> <span class="p">{</span>
369 <span class="k">see</span> <span class="n">name</span> <span class="o">+</span> <span class="n">nl</span>
370 <span class="p">}</span>
371 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 括弧の外側 - 正常に動作します。</span>
374 <span class="k">class</span> <span class="n">otherclass</span>
375 <span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
379 <div class="highlight-none"><div class="highlight"><pre>10
386 <p>解決方法② : 括弧を使用しない</p>
387 <div class="highlight-ring"><div class="highlight"><pre><span class="k">new</span> <span class="n">point</span> <span class="p">{</span> <span class="n">test</span><span class="p">()</span> <span class="p">}</span>
389 <span class="k">class</span> <span class="n">point</span>
390 <span class="n">x</span><span class="o">=</span><span class="mi">10</span> <span class="n">y</span><span class="o">=</span><span class="mi">20</span>
391 <span class="k">func</span> <span class="n">test</span>
392 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span>
393 <span class="n">myobj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">otherclass</span>
394 <span class="k">see</span> <span class="n">myobj</span><span class="p">.</span><span class="n">name</span>
395 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span>
397 <span class="k">class</span> <span class="n">otherclass</span>
398 <span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
401 <p>解決方法③ : Self オブジェクトのコピー</p>
402 <p>この解決方法は、括弧でクラス属性へアクセスしたいときに使用します (読み取り)。</p>
403 <div class="highlight-ring"><div class="highlight"><pre><span class="k">new</span> <span class="n">point</span> <span class="p">{</span> <span class="n">test</span><span class="p">()</span> <span class="p">}</span>
405 <span class="k">class</span> <span class="n">point</span>
406 <span class="n">x</span><span class="o">=</span><span class="mi">10</span> <span class="n">y</span><span class="o">=</span><span class="mi">20</span>
407 <span class="k">func</span> <span class="n">test</span>
408 <span class="n">oSelf</span> <span class="o">=</span> <span class="n">self</span>
409 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span>
410 <span class="n">myobj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">otherclass</span> <span class="p">{</span>
411 <span class="k">see</span> <span class="n">name</span> <span class="o">+</span> <span class="n">nl</span>
412 <span class="k">see</span> <span class="n">oself</span><span class="p">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">oself</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">nl</span>
413 <span class="p">}</span>
415 <span class="k">class</span> <span class="n">otherclass</span>
416 <span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
420 <div class="highlight-none"><div class="highlight"><pre>10
428 <div class="highlight-ring"><div class="highlight"><pre><span class="n">oself</span> <span class="o">=</span> <span class="n">self</span>
431 <p>前行の問題はオブジェクトの新しいコピーあることです。
432 この理由は Ring の代入演算子はリストと値によるオブジェクト (参照ではない) はコピーしないからです。</p>
433 <p>新しいオブジェクトへアクセスする場合は問題はありません (読み取り)。</p>
434 <p>オブジェクトの属性を変更した場合は問題があります (そのためコピーを変更します!)</p>
435 <div class="admonition note">
436 <p class="first admonition-title">注釈</p>
437 <p class="last">括弧はコピーを行うときに再度使えます。</p>
439 <div class="highlight-ring"><div class="highlight"><pre><span class="k">new</span> <span class="n">point</span> <span class="p">{</span> <span class="n">test</span><span class="p">()</span> <span class="p">}</span>
441 <span class="k">class</span> <span class="n">point</span>
442 <span class="n">x</span><span class="o">=</span><span class="mi">10</span> <span class="n">y</span><span class="o">=</span><span class="mi">20</span>
443 <span class="k">func</span> <span class="n">test</span>
444 <span class="n">oSelf</span> <span class="o">=</span> <span class="n">self</span>
445 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span>
446 <span class="n">myobj</span> <span class="o">=</span> <span class="k">new</span> <span class="n">otherclass</span> <span class="p">{</span>
447 <span class="k">see</span> <span class="n">name</span> <span class="o">+</span> <span class="n">nl</span>
448 <span class="n">oSelf</span> <span class="p">{</span>
449 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span>
450 <span class="p">}</span>
451 <span class="p">}</span>
453 <span class="k">class</span> <span class="n">otherclass</span>
454 <span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span>
457 <p>GUI アプリケーションでは、様々なメソッドからコントロールへアクセス可能な属性として、
458 Window オブジェクトがあるクラスを作成します。
459 括弧でメソッドの内側にあるオブジェクトへアクセスするときは、前述の情報を思い出してください。
460 この場合は、オブジェクトとの属性へアクセスできないため Self オブジェクトをコピーした場合は、コピー先での作業となります。
461 新しいコントロールの作成は、コピーと関連付けられていますがアクセスはできません。</p>
463 <div class="section" id="index-10">
464 <span id="id9"></span><h2>クラスのメソッド内にある括弧からクラスの属性にアクセスするには<a class="headerlink" href="#index-10" title="このヘッドラインへのパーマリンク">¶</a></h2>
465 <p>クラスのメソッドからクラスの属性へ直接アクセスするために、属性やメソッド名の先頭に Self による参照を選択する方法があります。
466 クラスのメソッド内で括弧 { } を使うと、有効なオブジェクトのスコープを変更することになり、
467 クラスの属性へ直接アクセスするのを防ぎます。また Self の使用は、括弧でアクセスするオブジェクトを変更できるため Self による参照は効果がありません。</p>
468 <p>この場合、属性を読み取りたい場合は、括弧の使用前に
469 Self オブジェクトを必ずコピーしてください。
470 また、括弧の後に、オブジェクトの属性からローカル変数へコピーしたい場合は、必ず属性を修正してください。</p>
471 <p>この場合は、括弧の内側にある属性の読み取り、または変更をしたいときに発生します。</p>
472 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Class</span> <span class="n">MyApp</span>
474 <span class="n">oCon</span> <span class="c"># 属性</span>
476 <span class="c"># こちらへコードを記述してください。</span>
478 <span class="k">Func</span> <span class="n">OpenDatabase</span>
479 <span class="c"># こちらへコードを記述してください。</span>
480 <span class="k">new</span> <span class="n">QSqlDatabase</span><span class="p">()</span> <span class="p">{</span>
481 <span class="n">oCon</span> <span class="o">=</span> <span class="n">addDatabase</span><span class="p">(</span><span class="s">"QSQLITE"</span><span class="p">)</span> <span class="p">{</span>
482 <span class="n">setDatabaseName</span><span class="p">(</span><span class="s">"weighthistory.db"</span><span class="p">)</span>
483 <span class="n">open</span><span class="p">()</span>
484 <span class="p">}</span>
485 <span class="p">}</span>
486 <span class="n">self</span><span class="p">.</span><span class="n">oCon</span> <span class="o">=</span> <span class="n">oCon</span>
487 <span class="c"># こちらへコードを記述してください。</span>
490 <p>前述の用例で connection オブジェクトを作成して oCon 属性の内側で保存したいとします。</p>
491 <p>このオブジェクトは QSQLDatabase() オブジェクトのアクセス後に使用する addDatabase() メソッドからの出力です。</p>
492 <p>括弧の内側では MyApp クラスから作成したオブジェクトによる Self 参照の使用はできません。
493 ここで Self 参照を使用することは、括弧でオブジェクトをアクセスすることになるからです。</p>
494 <p>ローカル変数 oCon を作成してから、括弧の後に oCon 属性を変数へコピーすることにより、
496 <p>このコードは別の解決方法です。</p>
497 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Class</span> <span class="n">MyApp</span>
499 <span class="n">oCon</span> <span class="c"># 属性</span>
501 <span class="c"># こちらへコードを記述してください。</span>
503 <span class="k">Func</span> <span class="n">OpenDatabase</span>
504 <span class="c"># こちらへコードを記述してください。</span>
505 <span class="n">oCon</span> <span class="o">=</span> <span class="k">new</span> <span class="n">QSqlDatabase</span><span class="p">()</span>
506 <span class="n">oCon</span> <span class="o">=</span> <span class="n">oCon</span><span class="p">.</span><span class="n">addDatabase</span><span class="p">(</span><span class="s">"QSQLITE"</span><span class="p">)</span> <span class="p">{</span>
507 <span class="n">setDatabaseName</span><span class="p">(</span><span class="s">"weighthistory.db"</span><span class="p">)</span>
508 <span class="n">Open</span><span class="p">()</span>
509 <span class="p">}</span>
510 <span class="c"># こちらへコードを記述してください。</span>
513 <p>このコードは優れた解決方法です。</p>
514 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Class</span> <span class="n">MyApp</span>
516 <span class="n">oCon</span> <span class="c"># 属性</span>
518 <span class="c"># こちらへコードを記述してください。</span>
520 <span class="k">Func</span> <span class="n">OpenDatabase</span>
521 <span class="c"># こちらへコードを記述してください。</span>
522 <span class="k">new</span> <span class="n">QSqlDatabase</span><span class="p">()</span> <span class="p">{</span>
523 <span class="n">this</span><span class="p">.</span><span class="n">oCon</span> <span class="o">=</span> <span class="n">addDatabase</span><span class="p">(</span><span class="s">"QSQLITE"</span><span class="p">)</span> <span class="p">{</span>
524 <span class="n">setDatabaseName</span><span class="p">(</span><span class="s">"weighthistory.db"</span><span class="p">)</span>
525 <span class="n">Open</span><span class="p">()</span>
526 <span class="p">}</span>
527 <span class="p">}</span>
528 <span class="c"># こちらへコードを記述してください。</span>
531 <div class="admonition note">
532 <p class="first admonition-title">注釈</p>
533 <p class="last">括弧の内側でクラスの属性 (oCon) へアクセスするために This.属性 を使用しています。</p>
536 <div class="section" id="gui">
537 <span id="index-11"></span><h2>GUI アプリケーションのウィンドウごとにクラスを作成するには<a class="headerlink" href="#gui" title="このヘッドラインへのパーマリンク">¶</a></h2>
538 <p>ウィンドウ用のクラスを作成するための優れた方法は、クラス名の直後にウィンドウを定義することです。</p>
539 <p>ウィンドウをコントロールの定義に関する問題は発生せずに、入れ子の括弧を使えます。
540 そして、属性はメソッドからアクセスできます。</p>
542 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Load</span> <span class="s">"guilib.ring"</span>
544 <span class="k">new</span> <span class="n">qApp</span>
545 <span class="p">{</span>
546 <span class="o">$</span><span class="n">ObjectName</span> <span class="o">=</span> <span class="s">"oFirstWindow"</span>
547 <span class="n">oFirstWindow</span> <span class="o">=</span> <span class="k">new</span> <span class="n">FirstWindow</span>
549 <span class="o">$</span><span class="n">ObjectName</span> <span class="o">=</span> <span class="s">"oSecondWindow"</span>
550 <span class="n">oSecondWindow</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SecondWindow</span>
552 <span class="n">exec</span><span class="p">()</span>
553 <span class="p">}</span>
555 <span class="k">Class</span> <span class="n">FirstWindow</span>
557 <span class="n">win</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span> <span class="p">{</span>
558 <span class="n">setgeometry</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">50</span><span class="p">,</span><span class="mi">300</span><span class="p">,</span><span class="mi">200</span><span class="p">)</span>
559 <span class="n">setWindowTitle</span><span class="p">(</span><span class="s">"First Window"</span><span class="p">)</span>
560 <span class="n">label1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qLabel</span><span class="p">(</span><span class="n">win</span><span class="p">)</span>
561 <span class="p">{</span>
562 <span class="n">setgeometry</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">,</span><span class="mi">300</span><span class="p">,</span><span class="mi">30</span><span class="p">)</span>
563 <span class="n">setText</span><span class="p">(</span><span class="s">"0"</span><span class="p">)</span>
564 <span class="p">}</span>
565 <span class="n">btn1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">win</span><span class="p">)</span>
566 <span class="p">{</span>
567 <span class="n">move</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
568 <span class="n">setText</span><span class="p">(</span><span class="s">"Increment"</span><span class="p">)</span>
569 <span class="n">setClickEvent</span><span class="p">(</span><span class="o">$</span><span class="n">ObjectName</span><span class="o">+</span><span class="s">".increment()"</span><span class="p">)</span>
570 <span class="p">}</span>
571 <span class="n">show</span><span class="p">()</span>
572 <span class="p">}</span>
574 <span class="k">Func</span> <span class="n">Increment</span>
575 <span class="n">label1</span> <span class="p">{</span>
576 <span class="n">setText</span><span class="p">(</span> <span class="s">""</span> <span class="o">+</span> <span class="p">(</span> <span class="mi">0</span> <span class="o">+</span> <span class="n">text</span><span class="p">()</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">)</span>
577 <span class="p">}</span>
580 <span class="k">Class</span> <span class="n">SecondWindow</span>
582 <span class="n">win</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span> <span class="p">{</span>
583 <span class="n">setgeometry</span><span class="p">(</span><span class="mi">400</span><span class="p">,</span><span class="mi">50</span><span class="p">,</span><span class="mi">300</span><span class="p">,</span><span class="mi">200</span><span class="p">)</span>
584 <span class="n">setWindowTitle</span><span class="p">(</span><span class="s">"Second Window"</span><span class="p">)</span>
585 <span class="n">label1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qLabel</span><span class="p">(</span><span class="n">win</span><span class="p">)</span>
586 <span class="p">{</span>
587 <span class="n">setgeometry</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">,</span><span class="mi">300</span><span class="p">,</span><span class="mi">30</span><span class="p">)</span>
588 <span class="n">setText</span><span class="p">(</span><span class="s">"0"</span><span class="p">)</span>
589 <span class="p">}</span>
590 <span class="n">btn1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">win</span><span class="p">)</span>
591 <span class="p">{</span>
592 <span class="n">move</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
593 <span class="n">setText</span><span class="p">(</span><span class="s">"Decrement"</span><span class="p">)</span>
594 <span class="n">setClickEvent</span><span class="p">(</span><span class="o">$</span><span class="n">ObjectName</span><span class="o">+</span><span class="s">".decrement()"</span><span class="p">)</span>
595 <span class="p">}</span>
596 <span class="n">show</span><span class="p">()</span>
597 <span class="p">}</span>
599 <span class="k">Func</span> <span class="n">Decrement</span>
600 <span class="n">label1</span> <span class="p">{</span>
601 <span class="n">setText</span><span class="p">(</span> <span class="s">""</span> <span class="o">+</span> <span class="p">(</span> <span class="mi">0</span> <span class="o">+</span> <span class="n">text</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">)</span>
602 <span class="p">}</span>
606 <div class="section" id="self-self">
607 <span id="index-12"></span><h2>クラス範囲にある括弧内の Self と Self 間との名前衝突<a class="headerlink" href="#self-self" title="このヘッドラインへのパーマリンク">¶</a></h2>
608 <p>クラスの領域 (クラス名の後、そしてメソッドの前) で属性を定義します。</p>
609 <p>この領域では、グローバルスコープへアクセスできます。そして、ローカルスコープはオブジェクトスコープを指します。</p>
612 <li>グローバルスコープ —> グローバルスコープ</li>
613 <li>オブジェクトスコープ —> オブジェクトスコープ</li>
614 <li>ローカルスコープ —> オブジェクトスコープ</li>
617 <div class="highlight-ring"><div class="highlight"><pre><span class="k">New</span> <span class="n">Account</span> <span class="p">{</span>
618 <span class="k">see</span> <span class="n">aFriends</span>
619 <span class="p">}</span>
621 <span class="k">Class</span> <span class="n">Account</span>
622 <span class="n">name</span> <span class="o">=</span> <span class="s">"Mahmoud"</span>
623 <span class="n">aFriends</span> <span class="o">=</span> <span class="o">[]</span>
624 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span> <span class="p">{</span>
625 <span class="n">name</span> <span class="o">=</span> <span class="s">"Gal"</span>
626 <span class="p">}</span>
627 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span> <span class="p">{</span>
628 <span class="n">name</span> <span class="o">=</span> <span class="s">"Bert"</span>
629 <span class="p">}</span>
631 <span class="k">Class</span> <span class="n">Friend</span>
632 <span class="n">name</span>
636 <div class="highlight-none"><div class="highlight"><pre>name: NULL
640 <p>前述の用例における問題は account クラスには “name” 属性があり、
641 Friend クラスにも同名属性 “name” があります。</p>
642 <p>括弧内で self.name を使うと前述の用例と同じ結果になります!</p>
643 <div class="highlight-ring"><div class="highlight"><pre><span class="k">New</span> <span class="n">Account</span> <span class="p">{</span>
644 <span class="k">see</span> <span class="n">aFriends</span>
645 <span class="p">}</span>
647 <span class="k">Class</span> <span class="n">Account</span>
648 <span class="n">name</span> <span class="o">=</span> <span class="s">"Mahmoud"</span>
649 <span class="n">aFriends</span> <span class="o">=</span> <span class="o">[]</span>
650 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span> <span class="p">{</span>
651 <span class="n">self</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"Gal"</span>
652 <span class="p">}</span>
653 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span> <span class="p">{</span>
654 <span class="n">self</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"Bert"</span>
655 <span class="p">}</span>
657 <span class="k">Class</span> <span class="n">Friend</span>
658 <span class="n">name</span>
661 <p>この名前衝突に関して、括弧の内側で self.name でも解決しない理由は?</p>
662 <p>このようなクラスの範囲になるからです。</p>
664 <li>グローバルスコープ —> グローバルスコープ</li>
665 <li>オブジェクトスコープ —> オブジェクトスコープ (Account クラス)</li>
666 <li>ローカルスコープ —> ローカルスコープ (Account クラス)</li>
668 <p>括弧を使うとき、オブジェクトのスコープは変更されるため、このようになります。</p>
670 <li>グローバルスコープ —> グローバルスコープ</li>
671 <li>オブジェクトスコープ —> オブジェクトスコープ (Friend クラス)</li>
672 <li>ローカルスコープ —> ローカルスコープ (Account クラス)</li>
674 <p>Ring では、ローカルスコープを最初に検索するため、 self.name を使うときは Account クラスを使用します。</p>
676 <p>解決方法① : リストによるオブジェクトへのアクセス</p>
677 <div class="highlight-ring"><div class="highlight"><pre><span class="k">New</span> <span class="n">Account</span> <span class="p">{</span>
678 <span class="k">see</span> <span class="n">aFriends</span>
679 <span class="p">}</span>
681 <span class="k">Class</span> <span class="n">Account</span>
682 <span class="n">name</span> <span class="o">=</span> <span class="s">"Mahmoud"</span>
683 <span class="n">aFriends</span> <span class="o">=</span> <span class="o">[]</span>
684 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span>
685 <span class="n">aFriends</span><span class="o">[</span><span class="n">len</span><span class="p">(</span><span class="n">aFriends</span><span class="p">)</span><span class="o">]</span> <span class="p">{</span>
686 <span class="n">aFriends</span><span class="o">[</span><span class="n">len</span><span class="p">(</span><span class="n">aFriends</span><span class="p">)</span><span class="o">]</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"Gal"</span>
687 <span class="p">}</span>
688 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span>
689 <span class="n">aFriends</span><span class="o">[</span><span class="n">len</span><span class="p">(</span><span class="n">aFriends</span><span class="p">)</span><span class="o">]</span> <span class="p">{</span>
690 <span class="n">aFriends</span><span class="o">[</span><span class="n">len</span><span class="p">(</span><span class="n">aFriends</span><span class="p">)</span><span class="o">]</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"Bert"</span>
691 <span class="p">}</span>
693 <span class="k">Class</span> <span class="n">Friend</span>
694 <span class="n">name</span>
697 <p>解決方法② : name 属性を設定するために friend クラスでメソッドを作成</p>
698 <div class="highlight-ring"><div class="highlight"><pre><span class="k">New</span> <span class="n">Account</span> <span class="p">{</span>
699 <span class="k">see</span> <span class="n">aFriends</span>
700 <span class="p">}</span>
702 <span class="k">Class</span> <span class="n">Account</span>
703 <span class="n">name</span> <span class="o">=</span> <span class="s">"Mahmoud"</span>
704 <span class="n">aFriends</span> <span class="o">=</span> <span class="o">[]</span>
705 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span> <span class="p">{</span>
706 <span class="n">setname</span><span class="p">(</span><span class="s">"Gal"</span><span class="p">)</span>
707 <span class="p">}</span>
708 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span> <span class="p">{</span>
709 <span class="n">setname</span><span class="p">(</span><span class="s">"Bert"</span><span class="p">)</span>
710 <span class="p">}</span>
712 <span class="k">Class</span> <span class="n">Friend</span>
713 <span class="n">name</span>
714 <span class="k">func</span> <span class="n">setname</span> <span class="n">cName</span>
715 <span class="n">name</span> <span class="o">=</span> <span class="n">cName</span>
718 <p>解決方法③ : 属性を設定するために account クラスでメソッドを作成</p>
719 <div class="highlight-ring"><div class="highlight"><pre><span class="k">New</span> <span class="n">Account</span> <span class="p">{</span>
720 <span class="k">see</span> <span class="n">aFriends</span>
721 <span class="p">}</span>
723 <span class="k">Class</span> <span class="n">Account</span>
724 <span class="n">name</span> <span class="o">=</span> <span class="s">"Mahmoud"</span>
725 <span class="n">aFriends</span> <span class="o">=</span> <span class="o">[]</span>
726 <span class="n">friend</span><span class="p">(</span><span class="s">"Gal"</span><span class="p">)</span>
727 <span class="n">friend</span><span class="p">(</span><span class="s">"Bert"</span><span class="p">)</span>
729 <span class="k">func</span> <span class="n">friend</span> <span class="n">cName</span>
730 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span> <span class="p">{</span>
731 <span class="n">name</span> <span class="o">=</span> <span class="n">cName</span>
732 <span class="p">}</span>
734 <span class="k">Class</span> <span class="n">Friend</span>
735 <span class="n">name</span>
738 <p>解決方法④ : 宣言型プログラミング</p>
739 <div class="highlight-ring"><div class="highlight"><pre><span class="k">New</span> <span class="n">Account</span> <span class="p">{</span>
740 <span class="n">name</span> <span class="o">=</span> <span class="s">"mahmoud"</span>
741 <span class="n">friend</span> <span class="p">{</span>
742 <span class="n">name</span> <span class="o">=</span> <span class="s">"Gal"</span>
743 <span class="p">}</span>
744 <span class="n">friend</span> <span class="p">{</span>
745 <span class="n">name</span> <span class="o">=</span> <span class="s">"Bert"</span>
746 <span class="p">}</span>
747 <span class="k">see</span> <span class="n">aFriends</span>
748 <span class="p">}</span>
750 <span class="k">Class</span> <span class="n">Account</span>
751 <span class="n">name</span>
752 <span class="n">aFriends</span> <span class="o">=</span> <span class="o">[]</span>
753 <span class="n">friend</span>
754 <span class="k">func</span> <span class="n">getfriend</span>
755 <span class="n">aFriends</span> <span class="o">+</span> <span class="k">new</span> <span class="n">Friend</span>
756 <span class="k">return</span> <span class="n">aFriends</span><span class="o">[</span><span class="n">len</span><span class="p">(</span><span class="n">aFriends</span><span class="p">)</span><span class="o">]</span>
758 <span class="k">Class</span> <span class="n">Friend</span>
759 <span class="n">name</span>
763 <div class="highlight-none"><div class="highlight"><pre>name: Gal
768 <div class="section" id="index-13">
769 <span id="id10"></span><h2>括弧による現在のオブジェクトスコープの除外方法<a class="headerlink" href="#index-13" title="このヘッドラインへのパーマリンク">¶</a></h2>
770 <p>括弧から現在のオブジェクトスコープを別のオブジェクトスコープへ変更します。
771 クラス属性の変更、および同名変数の使わずに処理できます。</p>
772 <div class="highlight-ring"><div class="highlight"><pre><span class="k">new</span> <span class="n">point</span> <span class="p">{</span><span class="n">x</span><span class="o">=</span><span class="mi">10</span> <span class="n">y</span><span class="o">=</span><span class="mi">20</span> <span class="n">z</span><span class="o">=</span><span class="mi">30</span> <span class="n">start</span><span class="p">()</span> <span class="p">}</span>
773 <span class="k">class</span> <span class="n">point</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span>
774 <span class="k">func</span> <span class="n">start</span>
775 <span class="k">see</span> <span class="n">self</span> <span class="c"># x y z の値を表示 (10,20,30)</span>
776 <span class="k">new</span> <span class="n">Local</span> <span class="p">{</span>
777 <span class="n">x</span> <span class="o">=</span> <span class="mi">100</span>
778 <span class="n">y</span> <span class="o">=</span> <span class="mi">200</span>
779 <span class="n">z</span> <span class="o">=</span> <span class="mi">300</span>
780 <span class="p">}</span>
781 <span class="k">see</span> <span class="n">self</span> <span class="c"># x y z の値を表示 (10,20,30)</span>
782 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 100 の表示</span>
783 <span class="k">see</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 200 の表示</span>
784 <span class="k">see</span> <span class="n">z</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 300 の表示</span>
785 <span class="n">Self</span> <span class="p">{</span> <span class="c"># 利点なし - ローカルスコープの最初の検索で完了します。</span>
786 <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 100 の表示</span>
787 <span class="k">see</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 200 の表示</span>
788 <span class="k">see</span> <span class="n">z</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 300 の表示</span>
789 <span class="p">}</span>
790 <span class="k">see</span> <span class="n">self</span><span class="p">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 10 の表示</span>
791 <span class="k">see</span> <span class="n">self</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 20 の表示</span>
792 <span class="k">see</span> <span class="n">self</span><span class="p">.</span><span class="n">z</span> <span class="o">+</span> <span class="n">nl</span> <span class="c"># 30 の表示</span>
794 <span class="k">class</span> <span class="n">Local</span>
798 <div class="highlight-none"><div class="highlight"><pre>x: 10.000000
816 <div class="section" id="for">
817 <span id="index-14"></span><h2>For ループでローカルスコープを使用<a class="headerlink" href="#for" title="このヘッドラインへのパーマリンク">¶</a></h2>
818 <p>Ring 1.8 より、 For ループでの新規識別子 (変数) を定義するときは、ローカルスコープで定義します。</p>
820 <div class="highlight-ring"><div class="highlight"><pre><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span>
821 <span class="o">?</span> <span class="n">x</span> <span class="c"># 10 の表示</span>
822 <span class="n">test1</span><span class="p">()</span>
823 <span class="o">?</span> <span class="n">x</span> <span class="c"># 10 の表示</span>
824 <span class="n">test2</span><span class="p">()</span>
825 <span class="o">?</span> <span class="n">x</span> <span class="c"># 10 の表示</span>
827 <span class="k">func</span> <span class="n">test1</span>
828 <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">5</span>
829 <span class="k">next</span>
830 <span class="o">?</span> <span class="n">x</span> <span class="c"># 6 の表示</span>
832 <span class="k">func</span> <span class="n">test2</span>
833 <span class="kt">list</span> <span class="o">=</span> <span class="mi">1</span><span class="p">:</span><span class="mi">5</span>
834 <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="kt">list</span>
835 <span class="k">next</span>
836 <span class="o">?</span> <span class="n">x</span> <span class="c"># NULL の表示 ("For In" ループでは、ループ完了後に参照を破棄します)</span>
840 <div class="highlight-ring"><div class="highlight"><pre><span class="mi">10</span>
841 <span class="mi">6</span>
842 <span class="mi">10</span>
843 <span class="kp">NULL</span>
844 <span class="mi">10</span>
848 <div class="section" id="index-15">
849 <span id="id11"></span><h2>スコープ規則のまとめ<a class="headerlink" href="#index-15" title="このヘッドラインへのパーマリンク">¶</a></h2>
850 <p>最初に次のことを覚えておいてください。</p>
851 <p>1 - 各種プログラミング言語には言語の目的に基づいたスコープ規則があります。</p>
852 <p>2 - 小規模プログラミングと大規模プログラミングは異なります。</p>
853 <p>3 - あるプログラミング言語は小規模プログラミング用に設計されていますが、それ以外は大規模プログラミング用に設計されています。</p>
854 <p>4 - プログラミングで、スコープへのアクセスが複数ある場合があります。 - 正確に管理されていない場合は問題になります。</p>
855 <p>5 - 可視スコープの個数を削減することで、さらなる安全性を保ち続けることができます。</p>
856 <p>6 - あるプログラミング言語では、ある方法でスコープの管理を強制しており、それ以外の方法はありません!</p>
858 <p>1 - まず柔軟性、そして次に安全性を求めて設計された特別かつ「非常に単純明快」なスコープ規則があります</p>
859 <p>2 - Ring は小規模プログラミングと大規模プログラミングに対応するように設計されています。</p>
860 <p>3 - Ring にはプロジェクトの規模に基づいて選択可能な各種プログラミング・パラダイムがあります。ターゲットとなるプロジェクトで悪いパラダイムを選択した、または間違っているか一般的ではない方法によりパラダイムを使用するとエラーになります。</p>
861 <p>4 - Ring には選択肢があります。グローバル変数の使用、または使用を避けることができます。特殊記号 $ の指定、または除去できます。オブジェクト指向を使用する、または手続き型の使用を継続できます。クラス範囲 (クラスの範囲 - クラス名の後、およびメソッドの前) で属性の使用、またはコードで属性を使えます。</p>
862 <p>5 - このスコープ規則をご確認になり、記載されていることについて考えた後に好きな方法を使用してください。</p>
864 <p>1 - プログラムのコードのすべての場所において最大三種類のスコープだけあります (ローカルスコープ、オブジェクトのスコープとグローバルスコープ)。</p>
865 <p>2 - Ring が変数を検索するとき、最初にローカルスコープを、次にオブジェクトのスコープを、そしてグローバルスコープを検索します。</p>
866 <p>3 - 手続き、またはメソッドは、括弧 { } でオブジェクトへのアクセス、および現在のオブジェクトのスコープをいつでも変更できます。</p>
867 <p>4 - クラスの範囲 (クラス名の後、およびメソッドの前) において、これはオブジェクトスコープでオブジェクトのスコープとローカルスコープの両方を指す特別な範囲です。すなわち、この範囲で定義する各変数は属性になるため、ローカル変数ではありません。</p>
868 <p>5 - 変数 (スコープとクラスの範囲) の定義前に検索処理で変数が検出された場合は検出された変数を使用します。</p>
869 <p>6 - 関数とメソッドの仮引数は関数、またはメソッドへのローカル変数として自動的に定義されます。</p>
870 <p>7 - オブジェクト.属性 を使うとオブジェクト属性のみ検索します。</p>
871 <p>8 - Self.属性 を使うと先頭にある Self を最初に検索してから Self の属性を検索します。</p>
872 <p>9 - クラスの範囲 (クラス名の後、そしてメソッドの前) の内側にある Self 参照はクラスから作成されたオブジェクトのスコープを指します。</p>
873 <p>10 -メソッドの内側にある Self 参照は括弧による参照でオブジェクトへアクセスするときに変更されます。</p>
874 <p>11 - クラスの範囲 (クラス名の後、そしてメソッドの前) に変数名を直接記述すると、それらの使用または定義の意味となります。</p>
875 <p>12 - クラスの範囲で Self.属性 を使うと検索対象となるオブジェクトのスコープの個数を削減します (グローバルスコープとの名前衝突を回避します)。</p>
876 <p>これらの規則から名前衝突が何故発生するのか、そして回避するにはどうしたら良いかを理解できます。</p>
877 <p>名前衝突を避けるための簡単な助言として、スコープ規則を使用することが最良の方法です。</p>
878 <p>1 - グローバル変数の回避をしてください。</p>
879 <p>2 - Main 関数の使用 - これはグローバル変数の回避に有効です。</p>
880 <p>3 - グローバル変数を多用する場合は変数名の先頭に $ を使用してください。</p>
881 <p>4 - クラスの範囲で三番目 ($ の使用) の助言を考慮しない場合は、属性を定義するときに self.属性 を使用します。</p>
882 <p>5 - オブジェクトのスコープを変更したくない場合は、オブジェクト { 属性 } と オブジェクト { メソッド() } の代わりに オブジェクト.属性 と オブジェクト.メソッド() を使用します。</p>
883 <p>6 - 入れ子の括弧をクラスで使用する場合 - この範囲で { } + によりクラス属性へアクセスするために、オブジェクトのアクセス権がある場合はクラス範囲の使用に関して可能ならば考慮してください。</p>
884 <p>7 - クラスのメソッドの内側、および入れ子の括弧が使用されている場合は、括弧ごとにオブジェクトのスコープは変更されるため、直ちにクラスの属性へのアクセス権を失いますが、括弧 { } でローカルスコープの前後へアクセスできます。括弧からクラスの属性を読み取り、 または修正する場合は This.属性 を使用してください。この理由として ‘This’ を使用することは「このクラスからオブジェクトが作成される」ことを意味するのとは違い ‘Self’ (現在のスコープにあるオブジェクト) を意味します。</p>
885 <p>前述の要点を全て理解したならば、本章を会得したことになります。</p>
893 <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
894 <div class="sphinxsidebarwrapper"><h3>ページの内容</h3>
896 <li><a class="reference internal" href="#">変数と属性のスコープ規則</a><ul>
897 <li><a class="reference internal" href="#index-1">三種類のスコープ</a></li>
898 <li><a class="reference internal" href="#index-2">変数の定義と変数へのアクセス</a></li>
899 <li><a class="reference internal" href="#ring">Ring による変数の検出方法</a></li>
900 <li><a class="reference internal" href="#index-4">オブジェクト.属性の用法</a></li>
901 <li><a class="reference internal" href="#self">Self オブジェクト</a></li>
902 <li><a class="reference internal" href="#index-6">Ring における変数と属性の定義方法</a></li>
903 <li><a class="reference internal" href="#index-7">クラス属性とグローバル変数の間での名前衝突</a></li>
904 <li><a class="reference internal" href="#index-8">クラス属性とローカル変数の間での名前衝突</a></li>
905 <li><a class="reference internal" href="#index-9">括弧によるクラスのメソッドの内側にあるオブジェクトへのアクセス方法</a></li>
906 <li><a class="reference internal" href="#index-10">クラスのメソッド内にある括弧からクラスの属性にアクセスするには</a></li>
907 <li><a class="reference internal" href="#gui">GUI アプリケーションのウィンドウごとにクラスを作成するには</a></li>
908 <li><a class="reference internal" href="#self-self">クラス範囲にある括弧内の Self と Self 間との名前衝突</a></li>
909 <li><a class="reference internal" href="#index-13">括弧による現在のオブジェクトスコープの除外方法</a></li>
910 <li><a class="reference internal" href="#for">For ループでローカルスコープを使用</a></li>
911 <li><a class="reference internal" href="#index-15">スコープ規則のまとめ</a></li>
918 <p class="topless"><a href="qt3d.html"
919 title="前の章へ">Qt3D の用法</a></p>
921 <p class="topless"><a href="scope2.html"
922 title="次の章へ">関数とメソッドのスコープ規則</a></p>
923 <div role="note" aria-label="source link">
925 <ul class="this-page-menu">
926 <li><a href="_sources/scope.txt"
927 rel="nofollow">ソースコードを表示</a></li>
931 <form action="search.html" method="get">
932 <input type="text" name="q" placeholder="Search" />
933 <input type="hidden" name="check_keywords" value="yes" />
934 <input type="hidden" name="area" value="default" />
939 <div class="clearer"></div>
941 <footer class="footer">
942 <p class="pull-right">
943 <a href="_sources/scope.txt"
944 rel="nofollow">ソースコードを表示</a>
945 <a href="#">冒頭へ戻る</a></p>
947 © Copyright 2016-2020, Ring Team.<br/>
948 Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 1.3.6 / astropy-sphinx-theme 1.1 (isVowel)