OSDN Git Service

...。
[ring-lang-081/ring.git] / docs / ja-jp / build / html / scope.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6   <head>
7     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8     
9     <title>変数と属性のスコープ規則 &mdash; プログラミング言語 Ring 1.12 取扱説明書</title>
10     
11     <link rel="stylesheet" href="_static/bootstrap-astropy.css" type="text/css" />
12     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
13     
14     <script type="text/javascript">
15       var DOCUMENTATION_OPTIONS = {
16         URL_ROOT:    './',
17         VERSION:     '1.12',
18         COLLAPSE_INDEX: false,
19         FILE_SUFFIX: '.html',
20         HAS_SOURCE:  true
21       };
22     </script>
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'/>
31
32   </head>
33   <body role="document">
34 <div class="topbar">
35   <a class="brand" title="Documentation Home" href="index.html"><span id="logotext1">&#x1f369;Ring</span><span id="logotext2"> 1.12</span><span id="logotext3">:docs</span></a>
36   <ul>
37     
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>
44     
45     <li><a title="Ring Homepage" href="http://ring-lang.net/">Website</a></li>
46     <li><a title="総合索引" href="genindex.html">Index</a></li>
47     <li>
48       
49       
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" />
54 </form>
55       
56     </li>
57   </ul>
58 </div>
59
60 <div class="related">
61     <h3>ナビゲーション</h3>
62     <ul>
63       <li class="right">
64         <a href="scope2.html" title="関数とメソッドのスコープ規則">
65           次へ &raquo;
66         </a>
67       </li>
68       <li class="right">
69         <a href="qt3d.html" title="Qt3D の用法">
70           &raquo; 前へ
71         </a>
72          |
73       </li>
74       <li>
75         <a href="index.html">プログラミング言語 Ring 1.12 取扱説明書</a>
76          &raquo;
77       </li>
78       
79       <li>変数と属性のスコープ規則</li> 
80     </ul>
81 </div>
82   
83
84     <div class="document">
85       <div class="documentwrapper">
86         <div class="bodywrapper">
87           <div class="body" role="main">
88             
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>
94 <ul class="simple">
95 <li>グローバル変数 (使用を避けることに努めてください)</li>
96 <li>クラス (オブジェクト指向)</li>
97 <li>括弧 { } によるオブジェクトのアクセス</li>
98 <li>宣言型プログラミング</li>
99 <li>自然言語プログラミング</li>
100 </ul>
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>
108 </ol>
109 </div>
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>&#8216;Class&#8217; キーワードとクラス名末尾に、変数名の定義を記述したとしても、今まで通りグローバルスコープへアクセスできます。</li>
116 </ol>
117 <p>この範囲 (クラスの範囲 - クラス名の後、およびメソッドの前) にあるものは、</p>
118 <blockquote>
119 <div><ul class="simple">
120 <li>グローバルスコープ &#8212;-&gt; グローバルスコープ</li>
121 <li>オブジェクトスコープ &#8212;-&gt; オブジェクトスコープ</li>
122 <li>ローカルスコープ  &#8212;-&gt; オブジェクトスコープ</li>
123 </ul>
124 </div></blockquote>
125 <div class="admonition note">
126 <p class="first admonition-title">注釈</p>
127 <p class="last">クラスの範囲にあるローカルスコープからでも、この範囲のオブジェクトスコープを指すため、入れ子の括弧は使用可能でありローカルスコープからクラスのオブジェクトスコープへのアクセスができます。</p>
128 </div>
129 <div class="admonition tip">
130 <p class="first admonition-title">情報</p>
131 <p class="last">この範囲での定義によりウィンドウとコントロールの属性を作成できます。</p>
132 </div>
133 <div class="admonition tip">
134 <p class="first admonition-title">情報</p>
135 <p class="last">クラスの範囲にてオブジェクトの作成、および括弧 { } でオブジェクトへアクセスした後に、括弧の内側で Self.属性 を使うとクラスを使えます (アクセスしようとしているオブジェクトではありません)。この理由はローカルスコープからクラスを呼び出すことができるからです。</p>
136 </div>
137 <ol class="arabic simple" start="4">
138 <li>関数の仮引数は、自動的にローカルスコープへ定義されます。</li>
139 </ol>
140 </div>
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>
144 <ul class="simple">
145 <li>見つからない!</li>
146 </ul>
147 <p>2 - オブジェクトスコープの検索</p>
148 <ul class="simple">
149 <li>見つからない!</li>
150 </ul>
151 <p>3 - パブリックスコープの検索</p>
152 <ul class="simple">
153 <li>見つからない &#8212;-&gt; ランタイムエラー</li>
154 <li>見つかった &#8212;-&gt; 次回の検索を回避するために、最適化できるかどうか確認します (性能改善のためのポインタとキャッシュ)。</li>
155 </ul>
156 </div>
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>
164 </div>
165 </div>
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>
177 <ul class="simple">
178 <li>グローバルスコープ   &#8212;&gt; グローバルスコープ</li>
179 <li>オブジェクトスコープ &#8212;&gt; オブジェクトスコープ</li>
180 <li>ローカルスコープ     &#8212;&gt; オブジェクトスコープ</li>
181 </ul>
182 <p>括弧を使うとオブジェクトのスコープのみ変更されます。
183 Ring は変数を検索するときに、ローカルスコープを最初に検索するためクラスの内側にある Self を検出します。</p>
184 </div>
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>
188 <p>1 - 変数名で検索</p>
189 <p>2 - 見つからない &#8212;&gt; ランタイムエラーの回避と現在のスコープへ変数を定義します。</p>
190 <p>3 - 見つかった &#8212;&gt; 変数を使用しますが現在のスコープへ変数を一切定義しません。</p>
191 <ul class="simple">
192 <li>グローバルの範囲 (関数またはクラスの前) において現在のスコープはグローバルスコープになります。</li>
193 <li>クラスの範囲 (クラス名の後、およびメソッドの前) において現在のスコープはオブジェクトの属性になります。</li>
194 <li>関数とメソッドにおける現在のスコープはローカルスコープになります。</li>
195 </ul>
196 </div>
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">&quot;test&quot;</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>
203
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>
208 </pre></div>
209 </div>
210 <p>前述の用例ではグローバル変数 ‘name’ が
211 person クラスの内側にあります。</p>
212 <p>Ring は‘name’ 変数を使用するにとき検索処理の開始、
213 および検出します。</p>
214 <p>見つかった   &#8212;&gt;  見つかったものを使用</p>
215 <p>見つからない &#8212;&gt;  新しい属性の定義</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">&quot;test&quot;</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>
223
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>
228 </pre></div>
229 </div>
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">&quot;test&quot;</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>
234
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>
239 </pre></div>
240 </div>
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">&quot;test&quot;</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>
245
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">&quot;name&quot;</span><span class="p">)</span>
248         <span class="n">address</span>
249         <span class="n">phone</span>
250 </pre></div>
251 </div>
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">&quot;test&quot;</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>
256
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>
261 </pre></div>
262 </div>
263 <p>この名前衝突に関する最善の解決方法は?</p>
264 <p>1 - グローバル変数で $ 記号を使用</p>
265 <p>2 - オプション扱い : グローバル変数の回避する、または Main 関数の使用</p>
266 <p>実際は両方とも実施します。</p>
267 <p>そのほかの解決方法</p>
268 <ul class="simple">
269 <li>属性名の先頭に Self を使います。または AddAttribute() を使用します。</li>
270 </ul>
271 </div>
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>
275 <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">&quot;nice&quot;</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">&quot;mahmoud&quot;</span> <span class="n">address</span><span class="o">=</span><span class="s">&quot;Egypt&quot;</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>
280
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>
285 </pre></div>
286 </div>
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">&quot;nice&quot;</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">&quot;mahmoud&quot;</span> <span class="n">address</span><span class="o">=</span><span class="s">&quot;Egypt&quot;</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>
294
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>
299 </pre></div>
300 </div>
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">&quot;nice&quot;</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">&quot;mahmoud&quot;</span> <span class="n">address</span><span class="o">=</span><span class="s">&quot;Egypt&quot;</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>
306
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>
311 </pre></div>
312 </div>
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">&quot;nice&quot;</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">&quot;mahmoud&quot;</span>
318         <span class="n">o1</span><span class="p">.</span><span class="n">address</span> <span class="o">=</span><span class="s">&quot;Egypt&quot;</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>
321
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>
326 </pre></div>
327 </div>
328 </div>
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>
336
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>
345
346 <span class="k">class</span> <span class="n">otherclass</span>
347         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;test&quot;</span>
348 </pre></div>
349 </div>
350 <p>実行結果:</p>
351 <div class="highlight-none"><div class="highlight"><pre>10
352 20
353 test
354
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
358 </pre></div>
359 </div>
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>
363
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>
372
373
374 <span class="k">class</span> <span class="n">otherclass</span>
375         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;test&quot;</span>
376 </pre></div>
377 </div>
378 <p>実行結果:</p>
379 <div class="highlight-none"><div class="highlight"><pre>10
380 20
381 test
382 10
383 20
384 </pre></div>
385 </div>
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>
388
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>
396
397 <span class="k">class</span> <span class="n">otherclass</span>
398         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;test&quot;</span>
399 </pre></div>
400 </div>
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>
404
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>
414
415 <span class="k">class</span> <span class="n">otherclass</span>
416         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;test&quot;</span>
417 </pre></div>
418 </div>
419 <p>実行結果:</p>
420 <div class="highlight-none"><div class="highlight"><pre>10
421 20
422 test
423 10
424 20
425 </pre></div>
426 </div>
427 <p>この行を参照してください</p>
428 <div class="highlight-ring"><div class="highlight"><pre><span class="n">oself</span> <span class="o">=</span> <span class="n">self</span>
429 </pre></div>
430 </div>
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>
438 </div>
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>
440
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>
452
453 <span class="k">class</span> <span class="n">otherclass</span>
454         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;test&quot;</span>
455 </pre></div>
456 </div>
457 <p>GUI アプリケーションでは、様々なメソッドからコントロールへアクセス可能な属性として、
458 Window オブジェクトがあるクラスを作成します。
459 括弧でメソッドの内側にあるオブジェクトへアクセスするときは、前述の情報を思い出してください。
460 この場合は、オブジェクトとの属性へアクセスできないため Self オブジェクトをコピーした場合は、コピー先での作業となります。
461 新しいコントロールの作成は、コピーと関連付けられていますがアクセスはできません。</p>
462 </div>
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>
473
474         <span class="n">oCon</span>   <span class="c"># 属性</span>
475
476         <span class="c"># こちらへコードを記述してください。</span>
477
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">&quot;QSQLITE&quot;</span><span class="p">)</span> <span class="p">{</span>
482                                 <span class="n">setDatabaseName</span><span class="p">(</span><span class="s">&quot;weighthistory.db&quot;</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>
488 </pre></div>
489 </div>
490 <p>前述の用例で connection オブジェクトを作成して oCon 属性の内側で保存したいとします。</p>
491 <p>このオブジェクトは QSQLDatabase() オブジェクトのアクセス後に使用する addDatabase() メソッドからの出力です。</p>
492 <p>括弧の内側では MyApp クラスから作成したオブジェクトによる Self 参照の使用はできません。
493 ここで Self 参照を使用することは、括弧でオブジェクトをアクセスすることになるからです。</p>
494 <p>ローカル変数 oCon を作成してから、括弧の後に oCon 属性を変数へコピーすることにより、
495 前述の問題を解決しました。</p>
496 <p>このコードは別の解決方法です。</p>
497 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Class</span> <span class="n">MyApp</span>
498
499         <span class="n">oCon</span>   <span class="c"># 属性</span>
500
501         <span class="c"># こちらへコードを記述してください。</span>
502
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">&quot;QSQLITE&quot;</span><span class="p">)</span> <span class="p">{</span>
507                         <span class="n">setDatabaseName</span><span class="p">(</span><span class="s">&quot;weighthistory.db&quot;</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>
511 </pre></div>
512 </div>
513 <p>このコードは優れた解決方法です。</p>
514 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Class</span> <span class="n">MyApp</span>
515
516         <span class="n">oCon</span>   <span class="c"># 属性</span>
517
518         <span class="c"># こちらへコードを記述してください。</span>
519
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">&quot;QSQLITE&quot;</span><span class="p">)</span> <span class="p">{</span>
524                                 <span class="n">setDatabaseName</span><span class="p">(</span><span class="s">&quot;weighthistory.db&quot;</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>
529 </pre></div>
530 </div>
531 <div class="admonition note">
532 <p class="first admonition-title">注釈</p>
533 <p class="last">括弧の内側でクラスの属性 (oCon) へアクセスするために This.属性 を使用しています。</p>
534 </div>
535 </div>
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>
541 <p>用例:</p>
542 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Load</span> <span class="s">&quot;guilib.ring&quot;</span>
543
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">&quot;oFirstWindow&quot;</span>
547         <span class="n">oFirstWindow</span> <span class="o">=</span> <span class="k">new</span> <span class="n">FirstWindow</span>
548
549         <span class="o">$</span><span class="n">ObjectName</span> <span class="o">=</span> <span class="s">&quot;oSecondWindow&quot;</span>
550         <span class="n">oSecondWindow</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SecondWindow</span>
551
552         <span class="n">exec</span><span class="p">()</span>
553 <span class="p">}</span>
554
555 <span class="k">Class</span> <span class="n">FirstWindow</span>
556
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">&quot;First Window&quot;</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">&quot;0&quot;</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">&quot;Increment&quot;</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">&quot;.increment()&quot;</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>
573
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">&quot;&quot;</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>
578
579
580 <span class="k">Class</span> <span class="n">SecondWindow</span>
581
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">&quot;Second Window&quot;</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">&quot;0&quot;</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">&quot;Decrement&quot;</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">&quot;.decrement()&quot;</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>
598
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">&quot;&quot;</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>
603 </pre></div>
604 </div>
605 </div>
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>
610 <p>三種類のスコープ</p>
611 <ul class="simple">
612 <li>グローバルスコープ   &#8212;&gt; グローバルスコープ</li>
613 <li>オブジェクトスコープ &#8212;&gt; オブジェクトスコープ</li>
614 <li>ローカルスコープ     &#8212;&gt; オブジェクトスコープ</li>
615 </ul>
616 <p>三種類のスコープ</p>
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>
620
621 <span class="k">Class</span> <span class="n">Account</span>
622         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;Mahmoud&quot;</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">&quot;Gal&quot;</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">&quot;Bert&quot;</span>
629         <span class="p">}</span>
630
631 <span class="k">Class</span> <span class="n">Friend</span>
632         <span class="n">name</span>
633 </pre></div>
634 </div>
635 <p>実行結果:</p>
636 <div class="highlight-none"><div class="highlight"><pre>name: NULL
637 name: NULL
638 </pre></div>
639 </div>
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>
646
647 <span class="k">Class</span> <span class="n">Account</span>
648         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;Mahmoud&quot;</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">&quot;Gal&quot;</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">&quot;Bert&quot;</span>
655         <span class="p">}</span>
656
657 <span class="k">Class</span> <span class="n">Friend</span>
658         <span class="n">name</span>
659 </pre></div>
660 </div>
661 <p>この名前衝突に関して、括弧の内側で self.name でも解決しない理由は?</p>
662 <p>このようなクラスの範囲になるからです。</p>
663 <ul class="simple">
664 <li>グローバルスコープ   &#8212;&gt; グローバルスコープ</li>
665 <li>オブジェクトスコープ &#8212;&gt; オブジェクトスコープ (Account クラス)</li>
666 <li>ローカルスコープ     &#8212;&gt; ローカルスコープ (Account クラス)</li>
667 </ul>
668 <p>括弧を使うとき、オブジェクトのスコープは変更されるため、このようになります。</p>
669 <ul class="simple">
670 <li>グローバルスコープ   &#8212;&gt; グローバルスコープ</li>
671 <li>オブジェクトスコープ &#8212;&gt; オブジェクトスコープ (Friend クラス)</li>
672 <li>ローカルスコープ     &#8212;&gt; ローカルスコープ (Account クラス)</li>
673 </ul>
674 <p>Ring では、ローカルスコープを最初に検索するため、 self.name を使うときは Account クラスを使用します。</p>
675 <p>様々な解決方法があります。</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>
680
681 <span class="k">Class</span> <span class="n">Account</span>
682         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;Mahmoud&quot;</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">&quot;Gal&quot;</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">&quot;Bert&quot;</span>
691         <span class="p">}</span>
692
693 <span class="k">Class</span> <span class="n">Friend</span>
694         <span class="n">name</span>
695 </pre></div>
696 </div>
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>
701
702 <span class="k">Class</span> <span class="n">Account</span>
703         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;Mahmoud&quot;</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">&quot;Gal&quot;</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">&quot;Bert&quot;</span><span class="p">)</span>
710         <span class="p">}</span>
711
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>
716 </pre></div>
717 </div>
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>
722
723 <span class="k">Class</span> <span class="n">Account</span>
724         <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;Mahmoud&quot;</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">&quot;Gal&quot;</span><span class="p">)</span>
727         <span class="n">friend</span><span class="p">(</span><span class="s">&quot;Bert&quot;</span><span class="p">)</span>
728
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>
733
734 <span class="k">Class</span> <span class="n">Friend</span>
735         <span class="n">name</span>
736 </pre></div>
737 </div>
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">&quot;mahmoud&quot;</span>
741         <span class="n">friend</span> <span class="p">{</span>
742                 <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;Gal&quot;</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">&quot;Bert&quot;</span>
746         <span class="p">}</span>
747         <span class="k">see</span> <span class="n">aFriends</span>
748 <span class="p">}</span>
749
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>
757
758 <span class="k">Class</span> <span class="n">Friend</span>
759         <span class="n">name</span>
760 </pre></div>
761 </div>
762 <p>実行結果:</p>
763 <div class="highlight-none"><div class="highlight"><pre>name: Gal
764 name: Bert
765 </pre></div>
766 </div>
767 </div>
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>
793
794 <span class="k">class</span> <span class="n">Local</span>
795 </pre></div>
796 </div>
797 <p>実行結果:</p>
798 <div class="highlight-none"><div class="highlight"><pre>x: 10.000000
799 y: 20.000000
800 z: 30.000000
801 x: 10.000000
802 y: 20.000000
803 z: 30.000000
804 100
805 200
806 300
807 100
808 200
809 300
810 10
811 20
812 30
813 </pre></div>
814 </div>
815 </div>
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>
819 <p>用例:</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>
826
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>
831
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 の表示 (&quot;For In&quot; ループでは、ループ完了後に参照を破棄します)</span>
837 </pre></div>
838 </div>
839 <p>実行結果:</p>
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>
845 </pre></div>
846 </div>
847 </div>
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>
857 <p>Ring では</p>
858 <p>1 - まず柔軟性、そして次に安全性を求めて設計された特別かつ「非常に単純明快」なスコープ規則があります</p>
859 <p>2 - Ring は小規模プログラミングと大規模プログラミングに対応するように設計されています。</p>
860 <p>3 - Ring にはプロジェクトの規模に基づいて選択可能な各種プログラミング・パラダイムがあります。ターゲットとなるプロジェクトで悪いパラダイムを選択した、または間違っているか一般的ではない方法によりパラダイムを使用するとエラーになります。</p>
861 <p>4 - Ring  には選択肢があります。グローバル変数の使用、または使用を避けることができます。特殊記号 $ の指定、または除去できます。オブジェクト指向を使用する、または手続き型の使用を継続できます。クラス範囲 (クラスの範囲 - クラス名の後、およびメソッドの前) で属性の使用、またはコードで属性を使えます。</p>
862 <p>5 - このスコープ規則をご確認になり、記載されていることについて考えた後に好きな方法を使用してください。</p>
863 <p>スコープ規則:</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>
886 </div>
887 </div>
888
889
890           </div>
891         </div>
892       </div>
893       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
894         <div class="sphinxsidebarwrapper"><h3>ページの内容</h3>
895 <ul>
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>
912 </ul>
913 </li>
914 </ul>
915
916
917   <h4>前のトピックへ</h4>
918   <p class="topless"><a href="qt3d.html"
919                         title="前の章へ">Qt3D の用法</a></p>
920   <h4>次のトピックへ</h4>
921   <p class="topless"><a href="scope2.html"
922                         title="次の章へ">関数とメソッドのスコープ規則</a></p>
923   <div role="note" aria-label="source link">
924     <h3>このページ</h3>
925     <ul class="this-page-menu">
926       <li><a href="_sources/scope.txt"
927             rel="nofollow">ソースコードを表示</a></li>
928     </ul>
929    </div>
930       
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" />
935 </form>
936       
937         </div>
938       </div>
939       <div class="clearer"></div>
940     </div>
941 <footer class="footer">
942   <p class="pull-right">
943     <a href="_sources/scope.txt"
944        rel="nofollow">ソースコードを表示</a> &nbsp;
945     <a href="#">冒頭へ戻る</a></p>
946   <p>
947     &copy; 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)
949   </p>
950 </footer>
951   </body>
952 </html>