Ruby中的命令式与功能性编程

时间:2014-02-19 23:38:19

标签: ruby functional-programming immutability performance

我正在阅读这篇关于如何在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

虽然“mutable”选项不太安全,因为我们更改了数组的值,但是因为它调用了.compact,所以不可更改的选项似乎效率较低。这意味着它必须迭代数组以返回一个没有nil值的新数组。

在这种情况下,哪个选项更可取?一般来说,如何在不变性(功能)与性能之间做出选择(在命令性解决方案更快的情况下)?

1 个答案:

答案 0 :(得分:3)

你没错。通常情况下,纯功能解决方案比破坏性解决方案慢。不可变值通常意味着除非语言针对它们进行了很好的优化(Ruby不是这样),否则必须继续进行更多的分配。

但是,它并不重要。担心特定操作的性能并不能很好地利用99%的时间。从一段每秒运行100次的代码中剔除一微秒根本不是一场胜利。

最好的方法通常是做任何使你的代码最干净的方法。这通常意味着利用该语言的功能特性 - 例如mapselect而不是map!keep_if。然后,如果你需要加快速度,那么你可以使用一个漂亮,干净的代码库来进行更改,而不必担心你的更改会使一段代码踩到另一块数据。