ruby - Ruby 中的命令式与函数式编程

标签 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

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

在那种情况下,哪个选项更可取?通常,您如何在不变性(功能性)与性能(在命令式解决方案更快的情况下)之间做出选择?

最佳答案

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

然而,这通常并不重要。在 99% 的时间里,担心特定操作的性能并不能很好地利用你的时间。将一段每秒运行 100 次的代码缩短一微秒根本不是胜利。

最好的方法通常是做任何让你的代码最干净的事情。这通常意味着利用语言的功能特性——例如,mapselect 而不是 map!keep_if 。然后,如果您需要加快速度,您将拥有一个漂亮、干净的代码库,您可以对其进行更改,而不必担心您的更改会使一段代码覆盖另一段代码。

关于ruby - Ruby 中的命令式与函数式编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895006/

相关文章:

arrays - 在 ruby​​ 中,对于二维数组,如何删除与一个值不同的另一行匹配的行?

csv - 惰性 CSV 过滤/解析 - 提高性能

ruby-on-rails - 使用虚线路径 key 字符串访问 Ruby 哈希

ruby-on-rails - 将 Rails 3.2 升级到 4.2.6,路由生成错误的资源路径名

javascript - rails 4 : disable Turbolinks in a specific page

javascript - 我可以在 javascript 中不使用循环的情况下重复对象数组中的值 n 次吗?

haskell - IO monad 处理,简化绑定(bind)语法

ruby - 评估卡住的字符串

F# 错误 FS0695,此递归绑定(bind)使用无效的递归形式混合

java - 缓存方法导致不可变对象(immutable对象)