我在F#中有一个例子:
let a n = Convert.ToString(n:int32)
我可以说:
3 |> a
评估为"3"
。 Ruby中有类似的构造吗?
这是F#(和其他FP语言')方法链接,它不是函数组合,也不是Ruby中的方法链接,即返回self的对象,因此可以在{{{{{ 1}}。
答案 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
功能 - inject
,map
,select
,等
它将产生一个干净的可读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"