这个Ruby Array映射代码中是否有隐式关键字?

时间:2013-05-10 04:35:36

标签: ruby iteration block

是否有一个关键字可用于明确告诉map函数该特定迭代的结果应该是什么?

考虑:

a = [1,2,3,4,5]
a.map do |element|
  element.to_s
end

在上面的例子中,element.to_s隐含了每次迭代的结果。

在某些情况下,我不想依赖于使用最后执行的行作为结果,我宁愿明确说出代码中的结果。

例如,

a = [1,2,3,4,5]
a.map do |element|
  if some_condition
    element.to_s
  else
    element.to_f
  end
end

如果它写得像:

,我可能会更容易阅读
a = [1,2,3,4,5]
a.map do |element|
  if some_condition
    result_is element.to_s
  else
    result_is element.to_f
  end
end

那么我可以使用关键字代替result_is吗?

return将从调用函数返回,break将提前停止迭代,因此这些都不是我正在寻找的。

4 个答案:

答案 0 :(得分:4)

堆栈上剩下的最后一件事是自动调用块的结果。你是正确的return在这里不会产生预期的效果,但忽略了另一种可能性:声明一个单独的函数来评估条目。

例如,重新编写代码:

def function(element)
   if (some_condition)
     return element.to_s
   end

   element.to_f
end

a.map do |element|
  function(element)
end

调用该函数有一个名义上的开销,但在小型列表上它应该不是问题。如果这对性能非常敏感,那么您将需要这么做。

答案 1 :(得分:1)

map的本质是将最后执行的行分配给数组。您的上一个示例与以下示例非常相似,它遵循预期的行为:

a = [1,2,3,4,5]
a.map do |element|
  result = if some_condition
    element.to_s
  else
    element.to_f
  end
  result
end

答案 2 :(得分:1)

是的,有,它被称为next。但是,在此特定情况下使用next提高可读性。相反,它会a)混淆读者和b)给他的印象是该代码的作者不理解Ruby。

所有是Ruby中的表达式(有 no 语句)并且每个表达式的计算结果是该表达式中最后一个子表达式的值是基础 Ruby知识。

就像return一样,next只应在您想要从块的中间“返回”时使用。通常,您只将其用作保护条款。

答案 3 :(得分:0)

不,在迭代中执行其他代码之前,ruby中没有语言关键字可用于确定映射到结果数组的结果。

您可以指定一个变量,然后在执行其他代码时返回该变量:

a.map do |element|
  result = some_condition ? element.to_s : element.to_f

  #do something else with element

  result
end

请记住ruby没有为这种代码提供关键字的原因是这些模式往往具有非常低的可读性。