コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

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

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
{{lang|en|C#}}: 曖昧な説明を修正。例を追加。
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
8行目: 8行目:


<code>this</code>はメソッドへの[[引数]]となっている。例えば、C++で書いた以下のようなメソッドは、
<code>this</code>はメソッドへの[[引数]]となっている。例えば、C++で書いた以下のようなメソッドは、
<source lang="cpp">int foo::print (bar x)</source>
<syntaxhighlight lang="cpp">int foo::print (bar x)</syntaxhighlight>
本質的には[[C言語]]での以下のような呼び出しに相当している。
本質的には[[C言語]]での以下のような呼び出しに相当している。
<source lang="cpp">int foo_print (foo *const this, bar x)</source>
<syntaxhighlight lang="cpp">int foo_print (foo *const this, bar x)</syntaxhighlight>


[[Python]]や[[Perl]] 5など、言語によっては<code>this</code>をメソッドへの1つ目の引数として明記する必要がある。この引数の名前を<code>this</code>や<code>self</code>とする必然性はなく、他の引数と同様にどんな名前を付けても文法上問題はない。ただし、通常の場合、PythonやPerlでは慣習的に<code>self</code>が使われる。
[[Python]]や[[Perl]] 5など、言語によっては<code>this</code>をメソッドへの1つ目の引数として明記する必要がある。この引数の名前を<code>this</code>や<code>self</code>とする必然性はなく、他の引数と同様にどんな名前を付けても文法上問題はない。ただし、通常の場合、PythonやPerlでは慣習的に<code>self</code>が使われる。
32行目: 32行目:
C#7.2で追加された[[readonly構造体]]では、この<code>this</code>の書き換えを禁止できる。
C#7.2で追加された[[readonly構造体]]では、この<code>this</code>の書き換えを禁止できる。


<source lang="csharp">
<syntaxhighlight lang="csharp">
struct MyStruct {
struct MyStruct {
// 読み取り専用フィールド
// 読み取り専用フィールド
52行目: 52行目:
// ...
// ...
}
}
</syntaxhighlight>
</source>


==={{lang|en|Dylan}}===
==={{lang|en|Dylan}}===
68行目: 68行目:


多くの場面では、クラスベースオブジェクト指向言語の <code>this</code> と同じように使うことができる。たとえば、
多くの場面では、クラスベースオブジェクト指向言語の <code>this</code> と同じように使うことができる。たとえば、
<source lang='javascript'>
<syntaxhighlight lang='javascript'>
object.notify = function () { alert (this); };
object.notify = function () { alert (this); };
object.notify();
object.notify();
</syntaxhighlight>
</source>
のように関数(<code>object.notify</code>)をメソッドとして呼び出した場合、<code>this</code>は<code>object</code>を指す。また、
のように関数(<code>object.notify</code>)をメソッドとして呼び出した場合、<code>this</code>は<code>object</code>を指す。また、
<source lang='javascript'>
<syntaxhighlight lang='javascript'>
Counter = function () { this.counter_value = 0; };
Counter = function () { this.counter_value = 0; };
c = new Counter();
c = new Counter();
</syntaxhighlight>
</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=連載:{{lang|en|Ajax}}時代の{{lang|en|JavaScript}}プログラミング再入門 第4回 {{lang|en|JavaScript}} でオブジェクト指向プログラミング {{lang|en|Page}}1|publisher=[[@IT]]|date=2007年9月25日|accessdate=2011年12月13日| author=山田祥寛}}</ref>。
のように <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=連載:{{lang|en|Ajax}}時代の{{lang|en|JavaScript}}プログラミング再入門 第4回 {{lang|en|JavaScript}} でオブジェクト指向プログラミング {{lang|en|Page}}1|publisher=[[@IT]]|date=2007年9月25日|accessdate=2011年12月13日| author=山田祥寛}}</ref>。



2020年7月5日 (日) 23:04時点における版

thisは、プログラミング言語に出てくる概念のひとつで、自身の動いているオブジェクトを指す予約語。主にインスタンスメソッド内で使用される。thisの他にselfMeといった語を使う言語もあるが、言語を問わず概念は共通しているので、以下ではthisで代表させて記述することとする。

概要

thisは現在のオブジェクトを指した参照、あるいはポインタであり、たいていの場合は変更不可能である。

オブジェクトが生成すると、thisへの参照はつねに有効なものとなる。これは明示的に参照しなければならない言語もあれば、静的スコープで暗黙のうちに解決している言語もある。ただし、thisを暗黙のうちに解決する言語でも、明示的にthisを必要とする場面(ローカル変数で隠蔽されている同名のメンバー変数を参照する場合や、自身への参照を返り値とする場合など)もある。

thisはメソッドへの引数となっている。例えば、C++で書いた以下のようなメソッドは、

int foo::print (bar x)

本質的にはC言語での以下のような呼び出しに相当している。

int foo_print (foo *const this, bar x)

PythonPerl 5など、言語によってはthisをメソッドへの1つ目の引数として明記する必要がある。この引数の名前をthisselfとする必然性はなく、他の引数と同様にどんな名前を付けても文法上問題はない。ただし、通常の場合、PythonやPerlでは慣習的にselfが使われる。

GCCなど、一部のC++コンパイラでは、thisを引数に明示することで、その型を別なポインタに変えることができる[1]

C++Javaでの静的メソッドはインスタンスに対応せずクラスに所属するものであるため、thisは使えない。PythonRubySmalltalkObjective-Cなどでは、「クラスオブジェクト」のメソッド(クラスメソッド)となっていて、thisはクラスオブジェクトを指す。

言語ごとの事情

C++

初期のバージョンの C++ ではthisを変更でき、メソッド内から動作するオブジェクトを切り替えることができたが、のちに不可能となり、this右辺値となっている[2]

初期の C++ には参照がなかったが、もし最初から参照があったとしたら、thisはポインタではなく参照となっていたであろう[3]

C++ では、delete thisとすることで、オブジェクトが自ら消えることができる。

C#

C# では、thisは現在のインスタンスのメンバーを参照するのに用いられる。

特徴的な点として、C#の値型ではメンバー参照に加え、thisを代入式の左辺に置いて自分自身の値を書き換えることができる。 C#7.2で追加されたreadonly構造体では、このthisの書き換えを禁止できる。

struct MyStruct {
    // 読み取り専用フィールド
    public readonly int Num;

    public MyStruct(int num) {
        Num = num;
    }

    public void ChangeThis() {
        // 自分自身を書き換える
        // フィールドは読み取り専用にも関わらず、全体が書き換わる
        this = new MyStruct(Num + 1);
    }
}

// readonly構造体ではこの書き換えはできない。
readonly struct MyStruct {
    // ...
}

Dylan

Dylan では多重ディスパッチが行われ、thisという概念がないが、メッセージをあるオブジェクトに送るという意識は文法に残っている。下に示した2つの記法は糖衣構文であり、同等に動作する。

  • object.method(param1, param2)
  • method (object, param1, param2)

Java

Java では、thisは現在のインスタンスを指すキーワードであり、クラスの値やメソッドを参照するのに用いられる。Java ではインスタンスメソッドがすべて仮想メソッドなので、thisnull となることはない。

JavaScript

プロトタイプベースオブジェクト指向言語である JavaScript では、関数はオブジェクトに属している(メソッドである)ことも、属さないでいる(ただの関数である)こともできる。したがって、thisが何を指しているかは、関数の呼び出し方によって異なっている。

多くの場面では、クラスベースオブジェクト指向言語の this と同じように使うことができる。たとえば、

object.notify = function () { alert (this); };
object.notify();

のように関数(object.notify)をメソッドとして呼び出した場合、thisobjectを指す。また、

Counter = function () { this.counter_value = 0; };
c = new Counter();

のように new を付けて関数(Counter)をコンストラクタとして呼び出した場合、this は新しく生成されるオブジェクトを指す[4]

関数を単独で呼び出す場合は、thisはstrict-mode中であればundefinedであり、そうでなければグローバルオブジェクトを指すが、thisが何を指すかを個別に指定して呼び出すこともできる。(Function.prototype.apply) [5]

Object Pascal

Object Pascal では self が使われる。

Objective-C

Objective-C では self が使われる。

PHP

PHPでは、this が使われる。

Python

Python では、thisは文法上の予約語ではないが、自動的に対象となるオブジェクトが渡される、メンバ関数の1つ目の引数となっている。慣習的に、この引数の名前としてselfが使われる。classmethod修飾子を付けて定義されたクラスメソッドでは、1つ目の引数にクラスオブジェクトそのものが渡される。staticmethod修飾子を付けて作られた静的メソッドでは、1つ目の引数に何かが自動的に渡されることはない。

Ruby

Ruby では self が使われる。

Self

Self 言語は、「self」が使われることが名前の由来となっている。

Smalltalk

Smalltalk では self が使われる。

Visual Basic

Visual Basicでは Me が使われる。

脚注

外部リンク