2015-06-02 24 views
13

İşlevleri tanımlarken desen eşleşmesi vs guard cümlelerini kullanırken ne yapmam gerektiğini merak ediyorum. Elixir: Pattern Match veya Guard

desen eşleştirme ile Örnek: her ikisi de aynı sonucu ancak bir çözelti, diğer daha fazla tercih edilir anlamına

defmodule Exponent do 
    def power(value, n) when n==0, do: 1 
    def power(value, n), do: value*power(value, n-1) 
end 

: koruma maddesi vs

defmodule Exponent do 
    def power(value, 0), do: 1 
    def power(value, n), do: value*power(value, n-1) 
end 

? Ve eğer öyleyse neden?

Elixir'e yeni geldim, bu nedenle bu sorunun cevabı bana göre henüz belli değil (henüz). Şimdiden teşekkürler.

+0

Bir yapıda diğerine göre herhangi bir performans farkı gözlemliyor musunuz? Biri diğerine tercih edilip edilmediğini sormak, performans farkının olmaması durumunda bir görüş almak isteyen bir soruya harika bir örnek teşkil ediyor. Kapatmak için oy verin. –

+0

Gerçekten çok yeni, henüz böyle bir şeyi nasıl kıyaslayacağımı henüz keşfetmedim ... Aynı soruları da görmedim, bu yüzden açıkça sormaya karar verdim. – aren55555

+0

Bir uygulama ile diğeri arasında bir fark olabilir, ancak herhangi bir bağlam olmadan anlaması zor. Şu anda "hangisi daha iyi, muz ya da çilek" ile benzer bir soru soruyorsun? –

cevap

17

Muhafızlar desen eşleştirmesinden daha güçlüdür, ancak gereksiz olabilecek bir karmaşıklık katmanı oluştururlar. Örneğinizde olduğu gibi basit eşitlik kontrolleri için performans açısından eşdeğer olmalıdırlar. İşleri basitleştirmek için ilk önce desen eşleştirmeyi kullanmayı denemenizi öneririz. Eğer kesinlikle gerekliyse, bir koruma maddesine geri dönebilirsiniz. Yine de, zaman zaman okunabilirliğe yardımcı olduğunda, aksi halde yapmak mantıklı olabilir.

def sign(x) when x < 0, do: -1 
def sign(x) when x == 0, do: 0 
def sign(x) when x > 0, do: 1 

I koruma maddeleri eşitlik operatör için "doğru" kullanım durumunda daha karmaşık ifadeler, örneğin, bir parçası olarak kullanıldığı zaman varsayalım

def divisible?(x, divisor) when rem(x, divisor) == 0, do: true 
def divisible?(_x, _divisor), do: false