我目前正在编写一个Ruby类,该类提供基本lambda的菜单,这些菜单可以混合匹配以创建一组新的lambda。 (这是一种进化算法,需要根据数据集对适应度函数进行大量自定义)
发生这种情况的配置火灾中充满了这样的东西
function_from_modifier.(base_function, either.(modifier_from.(case),->(x){x}) )
身份功能->(x){x}
在配置文件中多次弹出,而且看起来很丑,所以我想知道是否有更优雅的方法。像Elixir的&(&1)
可以在Ruby中使用吗?
答案 0 :(得分:4)
tl; dr 摘要:Ruby核心或标准库中没有标识功能。实际上,在核心库或标准库中的任何地方,根本没有功能(就预定义的Proc
实例而言) 。
Ruby中的一等函数是第二类(如果有意义的话)。
当Yukihiro“ matz” Matsumoto最初设计Ruby时,他调查了其他语言的标准库,以供一等和更高阶函数使用,他发现绝大多数用途是:
不是为真的高阶函数的很大一部分是控制结构(例如,if
需要一个条件和两个结果),但是他想建模为-语言构造,而不是库函数。
因此,他决定针对他发现的常见情况优化Ruby,并创建了 blocks 。
块是不是一流的功能:
因此, real (在某种意义上说它们是实际的对象)与块相比,第一级函数(Proc
s)在某种意义上是第二级语言功能:
因此,从本质上讲,尝试以自己的方式使用Ruby时遇到限制是不足为奇的:这不是Ruby的目的。
过去,我经常随身携带一个像这样的常量的帮助器库:
class Proc
Id = -> x { x }
end
但是我停止这样做了。如果要使用Ruby,请使用Ruby作为OO语言,如果要使用高级FP,请使用Haskell或Scala或Clojure或Racket或…
答案 1 :(得分:3)
ruby中没有捕获匿名函数,因为在OOP中,有一些对象在其上定义了方法,而不是函数。
最相似的调用是Object#itself
,尽管人们可能会用method(:itself)
而不是->(x) { x }
,但由于许多原因,它并不完全相同。
为什么不只将匿名函数分配给变量并使用它,例如λ = ->(x) { x }
,然后在各处使用λ
?
侧注:使用裸函数而不是对either
的调用中的代码块对我来说似乎是一个糟糕的设计。块速度更快,在这种情况下,核心库ruby中的任何地方都使用块。