我正在阅读这篇关于如何以函数式风格使用 Ruby 编程的文章。 https://code.google.com/p/tokland/wiki/RubyFunctionalProgramming
以下是引起我注意的示例之一:
# No (mutable):
output = []
output << 1
output << 2 if i_have_to_add_two
output << 3
# Yes (immutable):
output = [1, (2 if i_have_to_add_two), 3].compact
“可变”选项不太安全,因为我们更改了数组的值,而不可变选项似乎效率较低,因为它调用 .compact
。这意味着它必须迭代数组以返回一个没有 nil 值的新数组。
在那种情况下,哪个选项更可取?通常,您如何在不变性(功能性)与性能(在命令式解决方案更快的情况下)之间做出选择?
最佳答案
你没有看错。通常情况下,纯功能性解决方案会比破坏性解决方案慢。不可变值通常意味着必须进行更多分配,除非语言针对它们进行了很好的优化(Ruby 不是)。
然而,这通常并不重要。在 99% 的时间里,担心特定操作的性能并不能很好地利用你的时间。将一段每秒运行 100 次的代码缩短一微秒根本不是胜利。
最好的方法通常是做任何让你的代码最干净的事情。这通常意味着利用语言的功能特性——例如,map
和 select
而不是 map!
和 keep_if
。然后,如果您需要加快速度,您将拥有一个漂亮、干净的代码库,您可以对其进行更改,而不必担心您的更改会使一段代码覆盖另一段代码。
关于ruby - Ruby 中的命令式与函数式编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895006/