是否有一个关键字可用于明确告诉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
将提前停止迭代,因此这些都不是我正在寻找的。 p>
答案 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没有为这种代码提供关键字的原因是这些模式往往具有非常低的可读性。