不同的ReasonML外部声明有什么含义?

在下面的示例中,两个外部声明都使用稍有不同的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")
button002 回答:不同的ReasonML外部声明有什么含义?

主要区别在于使用方式。

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")

dom1dom2在这里是指不同的值。使用dom1将按预期工作,而使用dom2将崩溃。 by_id也是如此。

那么您应该使用哪个?好吧,这取决于您的需求。如果您将始终使用当前作用域内的document,请使用bs.scope,因为这样更方便。如果不这样做,或者要使用具有多个不同值的相同功能,请使用@bs.send / @bs.send.pipe

本文链接:https://www.f2er.com/3047824.html

大家都在问