2015-06-02 2 views
13

Мне любопытно, когда я определяю функции, которые должны соответствовать шаблону vs guard.Elixir: Match Match или Guard

Например, при сопоставлении с образцом:

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

против пункта охраны:

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

я имею в виду и тот же результат, но одно решение предпочтительнее, чем другой? И если да, то почему?

Я новичок в Elixir, так что ответ на этот вопрос мне не совсем понятен (пока). Заранее спасибо.

+0

Вы наблюдаете какие-либо различия в производительности в одной конструкции по сравнению с другой? Если вы предпочитаете, чтобы кто-то предпочитал меня, то это отличный пример того, что хочет мнение, если нет разницы в производительности. Голосовать, чтобы закрыть. –

+0

Я честно так новичок, что еще не понял, как даже сравнивать такие вещи ... Я тоже не видел подобных вопросов, поэтому я решил явно спросить. – aren55555

+0

Может быть разница между одной реализацией и другой, но без какого-либо контекста это трудно сказать. Прямо сейчас вы задаете вопрос, аналогичный «что лучше, бананы или клубника?» –

ответ

17

Гвардии более мощные, чем сопоставление с образцами, но они представляют собой слой сложности, который может быть ненужным. Для простых проверок равенства, как в вашем примере, они должны быть эквивалентны с точки зрения производительности. Я рекомендую сначала использовать совпадение шаблонов, чтобы все было просто. Затем вы можете вернуться к пункту охраны, если это абсолютно необходимо. Тем не менее, иногда может иметь смысл делать это иначе, когда это помогает читаемости, например.

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

Я полагаю, что «правильный» вариант использования для оператора равенства в охранных клаузул, когда он используется в качестве части более сложных выражений, например

def divisible?(x, divisor) when rem(x, divisor) == 0, do: true 
def divisible?(_x, _divisor), do: false 
Смежные вопросы