在下面的示例中,两个外部声明都使用稍有不同的ReasonML函数结构来实现 same 功能。
外部声明样式是否会影响超出ReasonML函数结构的任何内容(例如性能)?另外,ReasonML是否具有“建议的”外部声明“样式”?
类型声明
type dom;
type element;
外部声明样式1
[@bs.val]
external dom: dom = "document";
[@bs.send.pipe : dom]
external get_by_id: string => element = "getElementById";
外部声明样式2
[@bs.scope "document"] [@bs.val]
external by_id: string => element = "getElementById";
ReasonML函数调用
let tag1 = dom |> get_by_id("main");
let tag2 = by_id("main")
答案 0 :(得分:1)
主要区别在于使用方式。
let tag1 = dom |> get_by_id("main"); // has two parts
let tag2 = by_id("main") // has only one part
具有两个部分意味着您可以将每个部分与其他部分交换出来,只要它们具有相同的类型签名即可。例如,我们可以将dom
(值)替换为dom
(类型)的另一个实例:
[@bs.new]
external make_doc: unit => dom = "Document";
let tag3 = make_doc() |> get_by_id("main");
但是,这还有一个更微妙的含义。有两个部分意味着您可以在不同的上下文中评估这些部分。这不是那么容易说明,但是考虑一下这个人为的例子:
[@bs.val]
external dom: dom = "document";
let dom1 = dom;
[%%raw {|var document = null|}];
let dom2 = dom;
let tag1 = dom1 |> get_by_id("main");
let tag2 = dom2 |> get_by_id("main");
let tag3 = by_id("main")
dom1
和dom2
在这里是指不同的值。使用dom1
将按预期工作,而使用dom2
将崩溃。 by_id
也是如此。
那么您应该使用哪个?好吧,这取决于您的需求。如果您将始终使用当前作用域内的document
,请使用bs.scope
,因为这样更方便。如果不这样做,或者要使用具有多个不同值的相同功能,请使用@bs.send
/ @bs.send.pipe
。