SORU
2 AĞUSTOS 2013, Cuma


Neden İksir fonksiyonları iki tip insan vardır?

İksir öğreniyorum ve fonksiyonları iki tür var acaba neden:

  • fonksiyonları def ile bir modülünde tanımlanmış myfunction(param1, param2) kullanarak aradı
  • anonim fonksiyonları fn, myfn.(param1, param2) kullanarak adı ile tanımlanır

Tek işlevi ikinci tür birinci sınıf bir nesne gibi görünüyor ve diğer işlevler için bir parametre olarak geçirilebilir. Bir işlev modülünde tanımlanmış fn Bir sarılmış olması gerekir. Bu kolay hale getirmek için otherfunction(myfunction(&1, &2)) gibi görünüyor bazı sözdizimsel şeker var, ama neden ilk etapta gerekli midir? Neden sadece otherfunction(myfunction)) yapabilir mi? Parantez olmadan modülü işlevleri çağırmak Ruby gibi yalnızca izin için mi? Ayrıca modül fonksiyonları ve taraftarlık olan Ayrık bu özelliği miras gibi görünüyor, yani aslında Ayrık VM aslında nasıl çalıştığını geliyor mu?

Orada herhangi bir fayda fonksiyonları iki tip olan ve diğer işlevler için onları geçmek için bir tür diğerine dönüştürme? Bir yararı iki farklı gösterimler işlevleri çağırmak gerek var mı?

CEVAP
2 AĞUSTOS 2013, Cuma


Alex,

Sadece adlandırma açıklığa kavuşturmak için, her iki işlevi vardır. Adında bir fonksiyon ve diğer isimsiz. Ama haklısın, bir şekilde farklı bir iş ve böyle neden ve nasıl çalıştıklarını göstermek için gidiyorum.

Hadi ikinci, fn ile başlar. fn kapatma, Ruby lambda benzer. Aşağıdaki gibi oluşturabiliriz

x = 1
fun = fn y -> x   y end
fun.(2) #=> 3

Bir işlev hükümler de birden fazla olabilir:

x = 1
fun = fn
  y when y < 0 -> x - y
  y -> x   y
end
fun.(2) #=> 3
fun.(-2) #=> 3

Şimdi, farklı bir şey deneyelim. Hadi farklı hükümler bağımsız farklı bir sayı bekliyor tanımlamak için deneyin:

fn
  x, y -> x   y
  x -> x
end
** (SyntaxError) cannot mix clauses with different arities in function definition

Oh hayır! Bir hata alırız! Argümanlar farklı sayıda beklediği mix hükümler veremeyiz. Bir işlev her zaman sabit bir parametre vardır.

Şimdi, hadi işlevleri adlı hakkında konuşmak:

def hello(x, y) do
  x   y
end

Beklendiği gibi, bir adı var ve ayrıca bazı argümanlar alabilir. Ancak, kapatma değil

x = 1
def hello(y) do
  x   y
end

Bu kod* *22, boş bir değişken olsun bir kapsam çünkü her zaman derlemek başarısız olur. Bu ikisi arasında önemli bir fark vardır. Ben özellikle fonksiyon adında her gerçeği gibi temiz bir sayfa ile başlar ve farklı kapsamları değişkenler hep birlikte karışık alamadım. Net bir sınır var.

Anonim bir fonksiyonu olarak Merhaba isimli fonksiyonu yukarıda almak edebiliriz. Kendin söyledin:

other_function(&hello(&1))

Ve sonra dedin, ben de edemiyor neden sadece diğer dillerde hello olarak geçiyor mu? Bu İksiri fonksiyonları adı ile tanımlanır çünküvesunar. Yani iki bağımsız değişken almayan bir fonksiyon eğer aynı ada sahip olsalardı bile üç beklediği daha farklı bir işlevdir. Eğer biz sadece hello geçirildiği takdirde 26 ** hiç bir fikrim yok olacağını sormak istemiştim. İki, üç ya da dört bağımsız değişken olan. Bu tam olarak farklı arities ile hükümler ile anonim bir fonksiyon oluşturabiliriz. neden aynı nedenidir.

İksir v0 beri.10.1, fonksiyonlar adında yakalamak için bir sözdizimi vardır:

&hello/1

Yerel işlev adlı Alo parametre 1 ile yakalayacaktır. Dil ve belgelerini boyunca, çok yaygın hello/1 bu sözdizimi işlevleri tanımlamak için.

Bu İksiri anonim işlevleri çağırmak için bir nokta kullanır nedeni de budur. Beri edemezsin sadece pass hello geçici olarak bir işlevi yerine ihtiyacın açık yakalama, doğal ayrım arasında adlandırılmış ve anonim fonksiyonlar ve farklı bir sözdizimi için arama her birinin yaptığı her şeyi biraz daha açık (Lispers olurdu bildik ile bu nedeniyle Peltek Peltek 1 vs 2 tartışma).

Genel olarak, bu iki fonksiyonları ve neden onlar farklı davranır neden olan.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kat Krazy

    Kat Krazy

    12 Kasım 2010
  • Murray Winiata

    Murray Winia

    2 ŞUBAT 2009
  • NextGenWindows

    NextGenWindo

    8 Kasım 2011