クロージャ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/04/08 06:32 UTC 版)
クロージャ(クロージャー、英語: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数にて利用可能な機能・概念である。引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。関数とそれを評価する環境のペアであるともいえる。この概念は少なくとも1960年代のSECDマシンまで遡ることができる。まれに、関数ではなくとも、環境に紐付けられたデータ構造のことをクロージャと呼ぶ場合もある。クロージャをサポートする言語によるプログラミングでは、単に関数の中に関数を定義することができるだけでなく、その際に、外側の関数(エンクロージャ)で宣言された変数を暗黙的に内側の関数に取り込んで操作することができる。主な利点としてはグローバル変数の削減やコールバック関数記述の簡素化が挙げられる。
- ^ クロージャ - JavaScript | MDN
- ^ “From LISP 1 to LISP 1.5”. www-formal.stanford.edu. 2024年4月7日閲覧。
- ^ Baker, Henry G. (July 1978). “Shallow binding in Lisp 1.5”. Commun. ACM (New York, NY, USA: Association for Computing Machinery) 21 (7): 565–569. doi:10.1145/359545.359566. ISSN 0001-0782 .
- ^ Sussman, Gerald Jay; Steele, Guy Lewis (1975). Scheme: An Interpreter for Extended Lambda Calculus (PDF) (Report). Massachusetts Institute of Technology.
- ^ Sussman, Gerald Jay; Steele Jr, Guy L (1998). “Scheme: A interpreter for extended lambda calculus”. Higher-Order and Symbolic Computation (Springer) 11 (4): 405–439. doi:10.1023/A:1010035624696 .
- ^ 英: anonymous class。「無名クラス」とも。オラクル日本語版サイトの表記に準拠し、匿名クラスとした。
- ^ Closures (Lambda Expressions) for the Java Programming Language
- ^ 英: functional interface。抽象メソッドを1つだけもつインタフェース。SAM (Single Abstract Method) typeと呼ばれることもある。
- ^ “Closures: Anonymous Functions that Capture Their Environment, Capturing References or Moving Ownership”. The Rust Programming Language. 2023年12月24日閲覧。
- ^ “Module std::pin”. The Rust Standard Library. 2023年12月24日閲覧。 “By default, all types in Rust are movable. Rust allows passing all types by-value, ...”
クロージャ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/21 23:55 UTC 版)
Groovyではコードブロックをファーストクラス(第一級)オブジェクトとして生成し、変数に格納したりメソッド引数や戻り値として受け渡したりすることができる。Groovyのライブラリは繰り返し処理や入出力処理などを中心にクロージャが駆使されており、簡潔な表記を行うことができる。 クロージャは構築されたスコープ内の変数を読み書きできる。 def str = "Hello World"def readerClosure = { println str }readerClosure()def writerClosure = { str = "foo" }writerClosure()println str このコードを実行すると Hello Worldfoo と出力される。
※この「クロージャ」の解説は、「Groovy」の解説の一部です。
「クロージャ」を含む「Groovy」の記事については、「Groovy」の概要を参照ください。
クロージャ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/24 15:35 UTC 版)
「Javaに対する批判」の記事における「クロージャ」の解説
Javaでは、内部クラス、ローカルクラス、匿名クラスを使用することで、基本的なクロージャに近い記述が実現できる。しかしこれは完全ではなく、ローカルクラス/匿名クラス外の変数に対する参照を、ローカルクラス/匿名クラスのフィールドとして暗黙キャプチャできるように、final修飾子付きで宣言する必要がある。これは、変数のスコープを抜けたときに削除できるような、様々な寿命に対応したスタックモデルをJVM実装者が選択できるようにするためである。Java 8では実質的にfinalとみなせる変数は明示的にfinal修飾する必要がなくなったが、依然として再代入は許可されない。 また匿名クラスの構文も冗長であり、例えばRunnableインタフェースを要求する場面で、同インタフェースを実装する匿名クラスを定義する場合、単純なコードブロックとして定義することはできず、Runnable.run()メソッドを実装するようなクラスのブロックを定義する必要がある。Java 8ではラムダ式と関数型インタフェースによりこの問題を改善している。
※この「クロージャ」の解説は、「Javaに対する批判」の解説の一部です。
「クロージャ」を含む「Javaに対する批判」の記事については、「Javaに対する批判」の概要を参照ください。
クロージャ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/11 02:27 UTC 版)
クロージャとなるようなブロックの引数渡し # オブジェクトのインスタンス変数(変数名の頭に@が付く)でブロックを記憶。def remember(&p) @block = pend# nameを受け取るブロックを引数に、上記のメソッドを呼び出す。remember {|name| puts "Hello, " + name + "!"}# 後に必要になった時点でクロージャを呼び出す。@block.call("John")# 表示:"Hello, John!" メソッドからクロージャを返す例 def create_set_and_get(value = 0) return proc {|x| value = x}, proc { value }endsetter, getter = create_set_and_getsetter.call(21)getter.call # => 21
※この「クロージャ」の解説は、「Ruby」の解説の一部です。
「クロージャ」を含む「Ruby」の記事については、「Ruby」の概要を参照ください。
「クロージャ」の例文・使い方・用例・文例
固有名詞の分類
- クロージャのページへのリンク