1

是否有一个关键字可以用来明确地告诉 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

4 回答 4

4

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

例如,修改您的代码:

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

   element.to_f
end

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

调用该函数会产生名义上的开销,但在小型列表中这应该不是问题。如果这是对性能高度敏感的,你会想用艰难的方式来做。

于 2013-05-10T04:45:58.800 回答
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
于 2013-05-10T04:44:39.573 回答
1

是的,有,它叫next. 但是,next在这种特殊情况下使用不会提高可读性。相反,它会 a) 使读者感到困惑, b) 给他的印象是该代码的作者不了解 Ruby。

Ruby中的一切都是表达式(没有语句),并且每个表达式的计算结果都是该表达式中最后一个子表达式的值,这是 Ruby 的基本知识。

就像return,next应该只在你想从一个块的中间“返回”时使用。通常,您仅将其用作保护子句。

于 2013-05-10T10:16:59.743 回答
0

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

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

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

  #do something else with element

  result
end

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

于 2013-05-10T06:23:04.527 回答