【问题标题】:Returning values in Elixir?在 Elixir 中返回值?
【发布时间】:2016-09-23 13:43:02
【问题描述】:

我最近决定学习 Elixir。来自 C++/Java/JavaScript 背景,我在掌握基础知识方面遇到了很多麻烦。这听起来可能很愚蠢,但返回语句如何在 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 中如何工作?

【问题讨论】:

  • 这是另一个关于如何提前返回的示例:elixir-examples.github.io/examples/return-early
  • @Brandon,谢谢伙计,所以在那个例子中,如果“some_condition”为假,它会输出“do_something()”输出的值?
  • 这根本不是一个愚蠢的问题。当一个函数用于命令式语言时,很难习惯每个函数都返回计算的最后一个值的概念。坚持下去——一旦你习惯了每个函数都返回一个值的想法,你会发现你的函数会变得更有凝聚力。
  • @wateriswet 没错,它会返回 do_something() 的值

标签: function elixir


【解决方案1】:

你是正确的,最后一个表达式总是被返回。甚至更多 - 语言中没有语句 - 只是表达式。每个构造都有一个值 - ifcase 等。也没有提前返回。这可能看起来很有限,但您很快就会习惯。

使用 Elixir 解决示例的常规方法是使用高阶函数:

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

【讨论】:

  • 感谢您的解释,我不得不对 Elixir 的无言以对。
  • 返回导致成功的值而不是简单的真或假的常见程序模式怎么样?
【解决方案2】:

Elixir 没有与其他语言中的“return”关键字等效的“break out”关键字。

通常你会做的是重新构造你的代码,这样最后执行的语句就是返回值。

下面是 elixir 中执行代码测试等价物的惯用方式,假设您的意思是“a”的行为类似于最初示例中的数组:

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

这里实际发生的是我们正在稍微调整我们的思维。我们将在代码 sn-p 中询问您真正想要的是什么,而不是在程序方法中搜索数组并在找到所需内容时提前返回: “这个数组在任何地方都有 22 吗?”

然后我们将使用 elixir Enum 库为我们遍历数组,并为 any? 函数提供一个测试,该测试将告诉我们是否有任何符合我们关心的标准。

虽然这种情况很容易通过枚举解决,但我认为您的问题的核心可能更多地适用于程序方法中使用的“弹跳模式”等事物。例如,如果我在某个方法中满足某些条件,则立即返回。一个很好的例子是如果你要处理的事情是 null 时返回 false 的方法:

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 - 不,没有等价物 - 您需要相应地构建您的代码。另一方面,这往往会使您的方法保持较小 - 并且您的意图清晰。

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2018-04-25
    • 1970-01-01
    • 2019-03-27
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多