Возвращаете значения в Эликсире?

Недавно я решил изучить Эликсир. Исходя из опыта работы с C ++ / Java / JavaScript, у меня были большие проблемы с пониманием основ. Это может показаться глупым, но как операторы return работают в Elixir? Я огляделся, и мне кажется, что это последняя строчка функции, т.е.

def Hello do 
  "Hello World!"
end

Будет ли эта функция возвращать «Hello World!», Есть ли другой способ сделать возврат? Кроме того, как бы вы вернулись пораньше? в JavaScript мы могли бы написать что-то вроде этого, чтобы узнать, есть ли в массиве определенное значение:

function foo(a){
   for(var i = 0;i<a.length;i++){
      if(a[i] == "22"){
         return true;
      }
   }
   return false;
}

Как это будет работать в Эликсире?

Вот еще один пример того, как вернуться раньше: elixir-examples.github.io/examples/ возврат рано   —  person Joe Thomas    schedule 26.05.2016

@Brandon, спасибо, чувак, так что в этом примере, если some_condition ложно, он выведет значение, которое выводит do_something ()?   —  person Joe Thomas    schedule 26.05.2016

Это совсем не глупый вопрос. При использовании императивных языков очень сложно привыкнуть к представлению о каждой функции, возвращающей последнее вычисленное значение. Придерживайтесь этого — как только вы привыкнете к идее, что каждая функция возвращает значение, вы обнаружите, что ваши функции станут намного более связными.   —  person Joe Thomas    schedule 26.05.2016

@wateriswet, это правильно, он вернет значение do_something ()   —  person Joe Thomas    schedule 27.05.2016

Возможный дубликат оператора возврата в Elixir   —  person Joe Thomas    schedule 05.02.2017

Для тех, кто действительно этого хочет, есть пакет возврата.   —  person Joe Thomas    schedule 05.02.2017

См. также:  Булева функция в C
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Joe Thomas

    В Elixir нет ключевого слова break out, которое было бы эквивалентно ключевому слову return в других языках.

    Обычно вы бы реструктурировали свой код так, чтобы возвращаемое значение было последним выполненным оператором.

    Ниже приведен идиоматический способ выполнения в elixir эквивалента теста кода, предполагая, что вы имели в виду ‘a’ как что-то, что ведет себя как массив, как в вашем первоначальном примере:

    def is_there_a_22(a) do
      Enum.any?(a, fn(item) -> item == "22" end.)
    end
    

    На самом деле здесь происходит то, что мы немного реструктурируем наше мышление. Вместо процедурного подхода, при котором мы будем искать по массиву и возвращаться раньше, если найдем то, что искали, мы собираемся спросить, что вам на самом деле нужно, в фрагменте кода: «Есть ли в этом массиве где-нибудь 22? ? «

    Затем мы собираемся использовать библиотеку elixir Enum, чтобы просмотреть массив для нас, и предоставить функции any? тест, который сообщит нам, соответствует ли что-либо критериям, о которых мы заботились.

    Хотя этот случай легко решается с помощью перечисления, я думаю, что, возможно, суть вашего вопроса больше относится к таким вещам, как «шаблон вышибалы», используемый в процедурных методах. Например, если я отвечаю определенным критериям в методе, немедленно возвращайтесь. Хорошим примером этого может быть метод, который возвращает false, если то, над чем вы собираетесь работать, имеет значение null:

    function is_my_property_true(obj) {
      if (obj == null) {
        return false;
      }
      // .....lots of code....
      return some_result_from_obj;
    }
    

    Единственный способ добиться этого в elixir — это поставить охрану вперед и исключить метод:

    def test_property_val_from_obj(obj) do
      # ...a bunch of code about to get the property
      # want and see if it is true
    end
    
    def is_my_property_true(obj) do
       case obj do
         nil -> false
         _ -> test_property_value_from_obj(obj)
       end
    end
    

    tl; dr — Нет эквивалента — вам нужно соответствующим образом структурировать свой код. С другой стороны, при этом ваши методы должны быть небольшими, а ваши намерения — ясными.

  2. Joe Thomas

    Вы правы в том, что последнее выражение всегда возвращается. Более того — в языке нет утверждений — только выражения. У каждой конструкции есть значение — if, case и т. Д. Также нет досрочного возврата. Это может показаться ограничивающим, но к этому быстро привыкаешь.

    Обычный способ решить ваш пример с помощью Elixir — использовать функцию более высокого порядка:

    def foo(list) do
      Enum.any?(list, fn x -> x == "22" end)
    end
    

    Спасибо за объяснение. Мне нужно осмыслить безызвестность Эликсира. person Joe Thomas; 26.05.2016

    Как насчет общего процедурного шаблона, который возвращает значение, вызывающее успех, а не просто истину или ложь? person Joe Thomas; 16.12.2019

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: