2011-03-16 5 views
8

Groovy documentation içinde kullanılan "kapatma" terimi ile ilgili biraz kafam karıştı. Belgelere göre, kapanış tanımları anonim bir işlev ya da lambda gibi görünüyor.Kapanış Groovy Kavramı

Birinci sınıf işlevleri destekleyen dillerin genellikle kapakların oluşturulmasına izin verdiğini anlıyorum. Bununla birlikte, iki kavram arasında bir ayrım vardır. Groovy dokümanlar göre Örneğin

:

Groovy bir kapak, bağımsız değişken alabilir bir değer iade ve referans ve onun çevresinde beyan değişkenleri kullanmak kod anonim yığınıdır kapsamı.

İşlevsel dil eşlemesinde, böyle bir anonim kod bloğu, genel olarak anonim bir lambda ifadesi veya ilişkisiz değişkenlere referanslar içermeyen bir lambda ifadesi veya bağlanmamış değişkenlere referans içermiyorsa kapalı bir lambda ifadesi olarak adlandırılabilir önceki örnek). Groovy böyle bir ayrım yapmaz. Sonra Kapalı Yolu üzerinde Wikipedia sayfaya göre

:

süreli kapatma genellikle yanlışlıkla anonim işlevini anlamında kullanılmaktadır.

Neyi eksik? Aynı page you linked to in the groovy docs sonraki paragrafta söylediği gibi

cevap

11

:

Açıkçası, bir kapatma tanımlanamaz. Yerel değişkenlere veya alanlarına/özelliklerine başvuran bir kod bloğu tanımlayabilirsiniz, ancak kapanışı, yalnızca "bağlama" ( bir anlam ver) değişkenleri için bu kod bloğu verildiğinde kapatılır. Kapanış, tanımlayamadığınız bir örnek gibi semantik bir konseptidir, sadece oluştur. Kesinlikle bir kapanış sadece tüm serbest değişkenler bağlı ise bir kapanış olduğunu söyledi. Bu durum olmadığı sürece, sadece kısmen kapalıdır, dolayısıyla gerçekten bir kapanma değildir. Groovy için bir yol temin etmez yana kapalı bir lambda fonksiyonu tanımlayabilir ve bir kod bloğu (bu serbest değişkenleri sahip olduğundan) her bir kapalı lambda fonksiyonu olmayabilir, biz kapağın her iki - bkz bile sözdizimsel kavram olarak. tanımlanması ve örneği oluşturma kodu biridir, çünkü sözdizimsel kavram olarak bu konuda konuştuğunu, hiçbir fark yoktur olduğunu. Biz bunu çok iyi terminoloji az ya da çok yanlış olduğunu biliyorum ama farkı "bilmez" bir dilde kod bahsederken birçok şeyi kolaylaştırır. O paragrafı okurken

+1

Belki gözlerim üzerinde sırlı. – Steve

+0

Muhtemelen son cümle '' Bu terminolojinin az ya da çok yanlış olduğunu çok iyi biliyoruz, fakat kod hakkında bir şeyden bahsettiğimizde, '' farkı '' fark etmeyen bir dili basitleştiriyor. –

+0

Bu bölüm açık. Ancak, bundan önce gelenler beynimin zihinsel olarak pes etmesine ve tüm paragrafı atlamasına neden oldu. :) – Steve