在many places中将“快速管道”运算符与“最后管道”进行比较的方式意味着它们是彼此的直接替代。是否要将值作为最后一个参数发送给函数?最后使用管道(|>
)。要将其作为第一个参数发送?使用快速管道(曾经|.
,现在不推荐使用->
)。
因此,就像我直到今天早些时候所做的那样,您的思考将被宽恕,以下代码将使您获得正则表达式匹配之外的第一个匹配:
Js.String.match([%re "/(\\w+:)*(\\w+)/i"], "int:id")
|> Belt.Option.getExn
-> Array.get(1)
但是你会错的(再次,就像我今天早些时候...)
相反,编译器发出以下警告:
We've found a bug for you!
OCaml preview 3:10-27
This has type:
'a option -> 'a
But somewhere wanted:
'b array
请参见this sandbox。有什么作用?
答案 0 :(得分:4)
看起来他们搞砸了->
的优先级,因此实际上将其解释为
Js.String.match([%re "/(\\w+:)*(\\w+)/i"], "int:id")
|> (Belt.Option.getExn->Array.get(1));
内联运算符:
Array.get(Belt.Option.getExn, 1, Js.String.match([%re "/(\\w+:)*(\\w+)/i"], "int:id"));
或部分应用程序更加明确,因为Reason的语法在计算方面有些混乱:
let f = Array.get(Belt.Option.getExn, 1);
f(Js.String.match([%re "/(\\w+:)*(\\w+)/i"], "int:id"));
用->
代替|.
是可行的。就像用|>
取代|.
一样。
我认为这是Rational中的一个错误,但是无论如何都建议不要使用“快速管道”,因为它会带来很多混乱,而带来的好处却很小。
答案 1 :(得分:1)
另请参见此discussion on Github,其中包含各种解决方法。将@glennsl保留为可接受的答案,因为它描述了问题的性质。