「This (プログラミング)」の版間の差分

削除された内容 追加された内容
Chobot (会話 | 投稿記録)
m ボット: 言語間リンク4件をウィキデータ上のQ3109046に転記
18行目:
[[C++]]や[[Java]]での[[静的メソッド]]はインスタンスに対応せず[[クラス (コンピュータ)|クラス]]に所属するものであるため、<code>this</code>は使えない。[[Python]]、[[Ruby]]、[[Smalltalk]]、[[Objective-C]]などでは、「クラスオブジェクト」のメソッド(クラスメソッド)となっていて、<code>this</code>はクラスオブジェクトを指す。
 
== 言語ごとの事情 ==
=== {{lang|en|C++ }}===
C++や、記法がC++に由来する言語(JavaやC#、PHP)では、たいていthisが使われている。
初期のバージョンの[[ {{lang|en|C++]]}} では<code>this</code>を変更でき、メソッド内から動作するオブジェクトを切り替えることができたが、のちに不可能となり、<code>this</code>は[[右辺値]]となっている<ref name="C++03">{{cite book|year=2003|title={{lang|en|ISO/IEC 14882:2003(E): Programming Languages - C++}}|publisher =ISO/IEC}}</ref>。
SmalltalkやObject Pascal、Python、Ruby、Objective-Cではselfが使われている。
そして、Visual BasicではMeである。
=== C++ ===
初期のバージョンの[[C++]]では<code>this</code>を変更でき、メソッド内から動作するオブジェクトを切り替えることができたが、のちに不可能となり、<code>this</code>は[[右辺値]]となっている<ref name="C++03">{{cite book
| year = 2003
| title = ISO/IEC 14882:2003(E): Programming Languages - C++
| publisher = ISO/IEC
}}
</ref>。
 
初期の {{lang|en|C++}} には参照がなかったが、もし最初から参照があったとしたら、<code>this</code>はポインタではなく参照となっていたであろう<ref>[http://www2.research.att.com/~bs/bs_faq2.html#this {{lang|en|Stroustrup: C++ Style and Technique FAQ}}]</ref>。
 
{{lang|en|C++}} では、<code>delete this</code>とすることで、オブジェクトが自ら消えることができる。
 
=== Java {{lang|en|C#}}===
[[C Sharp|C#]] <code>this</code> {{lang|en|Java}} 同様、参照となっている。しかし、「Value type」値型 <code>this</code> はかなり動作が異なり、代入式の左辺にも置きうる。
[[Java]]では、<code>this</code>は現在のインスタンスを指すキーワードであり、クラスの値やメソッドを参照するのに用いられる。
 
=== {{lang|en|Dylan }}===
Javaではインスタンスメソッドがすべて[[仮想メソッド]]なので、<code>this</code>が[[null]]となることはない。
{{lang|en|[[Dylan]]}} では[[多重ディスパッチ]]が行われ、<code>this</code>という概念がないが、メッセージをあるオブジェクトに送るという意識は文法に残っている。下に示した2つの記法は[[糖衣構文]]であり、同等に動作する。
*<code>object.method(param1, param2)</code>
*<code>method (object, param1, param2)</code>
 
==={{lang|en|Java}}===
[[{{lang|en|Java]]}} では、<code>this</code>は現在のインスタンスを指すキーワードであり、クラスの値やメソッドを参照するのに用いられる。{{lang|en|Java}} ではインスタンスメソッドがすべて[[仮想メソッド]]なので、<code>this</code>が <code>[[null]]</code> となることはない
<!-- この引用文をどうするか困ったので、とりあえずコメントアウトしています
''"...the reason for using this construct [this] is that we have a situation that is known as '''name overloading''' - the same name being used for two different entities....It is important to understand that the fields and the parameters are separate variables that exist independently of each other, even though they share similar names. A parameter and a field sharing a name is not really a problem in Java."'' - Objects First with Java, D. Barnes and M. Kölling
-->
=== C# {{lang|en|JavaScript}}===
[[プロトタイプベース]]オブジェクト指向言語である[[ {{lang|en|JavaScript]]}} では、関数はオブジェクトに属している(メソッドである)ことも、属さないでいる(ただの関数である)こともできる。<!-- 「属す」というのはそのオブジェクト・インスタンスのpropertyプロパティの指す値となっているという意味 -->したがって、<code>this</code>が何を指しているかは、関数の呼び出し方によって異なっている。
[[C Sharp|C#]]の<code>this</code>はJava同様、参照となっている。しかし、「Value type」の<code>this</code>はかなり動作が異なり、代入式の左辺にも置きうる。
 
多くの場面では、クラスベースオブジェクト指向言語のthisと同じように使うことができる。たとえば、<source lang='javascript'>object.notify = function () { alert (this); };
=== Dylan ===
<source lang='javascript'>
[[Dylan]]では[[多重ディスパッチ]]が行われ、<code>this</code>という概念がないが、メッセージをあるオブジェクトに送るという意識は文法に残っている。下に示した2つの記法は[[糖衣構文]]であり、同等に動作する。
object.notify = function () { alert (this); };
*<code>object.method(param1, param2)</code>
object.notify();
*<code>method (object, param1, param2)</code>
</source>
のように関数(<code>object.notify</cocde>)をメソッドとして呼び出した場合、<code>this</code>は<code>object</code>を指す。また、
<source lang='javascript'>
Counter = function () { this.counter_value = 0; };
c = new Counter();
</source>
c = new Counter();</source>のように <code>[[new演算子|new]]</code> を付けて関数((<code>Counter)</code>)を[[コンストラクタ]]として呼び出した場合、<code>this</code> は新しく生成されるオブジェクトを指す<ref name="atit_4_1">{{cite web | url=http://www.atmarkit.co.jp/fdotnet/ajaxjs/ajaxjs04/ajaxjs04_01.html | title=連載:Ajax:{{lang|en|Ajax}}時代の{{lang|en|JavaScript}}プログラミング再入門 第4回  {{lang|en|JavaScript}} でオブジェクト指向プログラミング Page1 {{lang|en|Page}}1| publisher=[[@IT]] | date=2007年9月25日 | accessdate=December 2011年12月13, 2011 | author=山田祥寛}}</ref>。
 
関数を単独で呼び出す場合は、<code>this</code>は<code>null</code>であるが、<code>this</code>が何を指すかを個別に指定して呼び出すこともできる。(<code>Function.apply</code>) <ref>{{cite web | url=http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0016 | title=これでできる! クロスブラウザ{{lang|en|JavaScript}}入門 第16回  {{lang|en|JavaScript}}<code>this</code><code>call </cocde>| publisher=[[技術評論社]] | date=2010年10月12日 | accessdate=December 2011年12月16, 2011 | author=太田昌吾}}</ref>。
 
==={{lang|en|Object Pascal}}===
{{lang|en|Object Pascal}} では <code>self</code> が使われる。
 
==={{lang|en|Objective-C}}===
{{lang|en|Objective-C}} では <code>self</code> が使われる。
 
=== Python PHP===
PHPでは、<code>this</code> が使われる。
[[Python]]では、<code>this</code>は文法上のキーワードではないが、自動的に対象となるオブジェクトが渡される、メンバ関数の1つ目の引数となっている。慣習的に、この引数の名前として<code>self</code>が使われる。<code>classmethod</code>修飾子を付けて定義されたクラスメソッドでは、1つ目の引数にクラスオブジェクトそのものが渡される。<code>staticmethod</code>修飾子を付けて作られた静的メソッドでは、1つ目の引数に何かが自動的に渡されることはない。
 
=== Self {{lang|en|Python}}===
[[{{lang|en|Python]]}} では、<code>this</code>は文法上のキーワードではないが、自動的に対象となるオブジェクトが渡される、メンバ関数の1つ目の引数となっている。慣習的に、この引数の名前として<code>self</code>が使われる。<code>classmethod</code>修飾子を付けて定義されたクラスメソッドでは、1つ目の引数にクラスオブジェクトそのものが渡される。<code>staticmethod</code>修飾子を付けて作られた静的メソッドでは、1つ目の引数に何かが自動的に渡されることはない。
[[Self]]というプログラミング言語は、「self」が使われることが名前の由来となっている。
 
=== Xbase++ {{lang|en|Ruby}}===
この言語{{lang|en|Ruby}} では <code>Self</code>、あるいは短縮形の<code>::self</code> が使われる。
 
=== JavaScript {{lang|en|Self}}===
{{lang|en|[[Self]]というプログラミング}} 言語は、「<code>self</code>」が使われることが名前の由来となっている。
[[プロトタイプベース]]オブジェクト指向言語である[[JavaScript]]では、関数はオブジェクトに属している(メソッドである)ことも、属さないでいる(ただの関数である)こともできる。<!-- 「属す」というのはそのオブジェクト・インスタンスのpropertyの指す値となっているという意味 -->したがって、<code>this</code>が何を指しているかは、関数の呼び出し方によって異なっている。
 
==={{lang|en|Smalltalk}}===
多くの場面では、クラスベースオブジェクト指向言語のthisと同じように使うことができる。たとえば、<source lang='javascript'>object.notify = function () { alert (this); };
{{lang|en|Smalltalk}} では <code>self</code> が使われる。
object.notify();</source>のように関数(object.notify<!-- これはobjectのクラスのプロトタイプのメソッド A.prototype.notify (where object instanceof A) の場合も同様 -->)をメソッドとして呼び出した場合、<code>this</code>は<code>object</code>を指す。また、<source lang='javascript'>Counter = function () { this.counter_value = 0; };
c = new Counter();</source>のように[[new演算子|new]]を付けて関数(Counter)を[[コンストラクタ]]として呼び出した場合、<code>this</code>は新しく生成されるオブジェクトを指す<ref name="atit_4_1">{{cite web | url=http://www.atmarkit.co.jp/fdotnet/ajaxjs/ajaxjs04/ajaxjs04_01.html | title=連載:Ajax時代のJavaScriptプログラミング再入門 第4回 JavaScriptでオブジェクト指向プログラミング Page1 | publisher=[[@IT]] | date=2007年9月25日 | accessdate=December 13, 2011 | author=山田祥寛}}</ref>。
 
==={{lang|en|Visual Basic}}===
関数を単独で呼び出す場合は、<code>this</code>は<code>null</code>であるが、<code>this</code>が何を指すかを個別に指定して呼び出すこともできる。(Function.apply) <ref>{{cite web | url=http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0016 | title=これでできる! クロスブラウザJavaScript入門 第16回 JavaScriptのthisとcall | publisher=[[技術評論社]] | date=2010年10月12日 | accessdate=December 16, 2011 | author=太田昌吾}}</ref>。
{{lang|en|Visual Basic}}では <code>Me</code> が使われる。
 
== 脚注 ==