有没有相当于F#|> (Ruby中的方法链接)?

时间:2013-10-12 22:55:33

标签: ruby f# chaining

我在F#中有一个例子:

let a n = Convert.ToString(n:int32)

我可以说:

3 |> a

评估为"3"。 Ruby中有类似的构造吗?

这是F#(和其他FP语言')方法链接,它不是函数组合,也不是Ruby中的方法链接,即返回self的对象,因此可以在{{{{{ 1}}。

3 个答案:

答案 0 :(得分:5)

这在Ruby中很容易实现。直接取自F#参考文档:

let function1 x = x + 1
let function2 x = x * 2

let result = 100 |> function1 |> function2
//> val result : int = 202

这可以用Ruby编写如下:

function1 = -> x { x + 1 }
function2 = -> x { x * 2 }

result = 100.pipe(function1).pipe(function2)
# => 202

使用Object#pipe的以下实现:

class Object
  def pipe(callable)
    callable.(self)
  end
end

或者用你的例子:

a = -> n { String(n) }

3.pipe(a)
# => '3'

并且

let f x y = x * y

3 |> f(2)
// > 6

成为

f = -> (x, y) { x * y }

3.pipe(f.curry.(2))
# => 6

答案 1 :(得分:2)

Ruby不支持此F#/ Ocaml / Haskel表示法。虽然我相信你可以做些什么。但重点是你不应该。

如果您想以功能样式(很棒)实现内容,可以使用ruby提供的Enumerable功能 - injectmapselect,等

它将产生一个干净的可读ruby代码,没有黑客攻击。

PS:问题+1。第一次开始使用红宝石时我也是自己问过。

答案 2 :(得分:1)

没有这样的符号,但您可以向Object添加一个将self传递给给定方法的方法。类似的东西:

class Object
  def pass_to(m)
    m.call(self)
  end
end

这将允许这样的调用:

def convert_to_string(n)
  n.to_s
end

def reverse_string(s)
  s.reverse
end

123
  .pass_to(method(:convert_to_string))
  .pass_to(method(:reverse_string))
#=> "321"

或使用lamdas:

convert_to_string = -> n { n.to_s }
reverse_string = -> s { s.reverse }

123
  .pass_to(convert_to_string)
  .pass_to(reverse_string)
#=> "321"

这相当于将to_s邮件发送至123(返回"123"),然后将reverse邮件发送至"123"

123
  .to_s
  .reverse
#=> "321"