elm是否共享或复制对象?
我正在开发一个电子商务网站,前端是Elm,我想知道对象是共享的还是复制的。我对答案很有把握,但我只是想确定一下elm是否共享或复制对象?,elm,Elm,我正在开发一个电子商务网站,前端是Elm,我想知道对象是共享的还是复制的。我对答案很有把握,但我只是想确定一下 基本上,我有一个ProductVariant,其中包含一些颜色。目前,ProductVariant作为一个字段color\u id:List colorId(这是我从json中获得的),但我正在考虑用颜色本身替换id:colors:List color。我可以在解码JSON后完成,我不需要在colors字典中查找颜色。假设每个颜色将在不同的变体之间共享,或者每个颜色将被复制,从而占用更
基本上,我有一个
ProductVariant
,其中包含一些颜色
。目前,ProductVariant
作为一个字段color\u id:List colorId
(这是我从json中获得的),但我正在考虑用颜色本身替换id:colors:List color
。我可以在解码JSON后完成,我不需要在colors
字典中查找颜色。假设每个颜色将在不同的变体之间共享,或者每个颜色将被复制,从而占用更多内存,这是正确的。我制作了一个简单的程序来查看编译后的JS输出。用Elm码
type alias Color = { red: Int, green: Int, blue: Int }
black: Color
black = { red = 255, green = 255, blue = 255 }
white: Color
white = { red = 0, green = 0, blue = 0 }
red: Color
red = { red = 255, green = 0, blue = 0 }
colors: List Color
colors =
[
black,
white,
red,
{ red = 123, green = 234, blue = 11 },
black,
{ red = 123, green = 234, blue = 11 },
red,
{ red = 123, green = 234, blue = 11 }
]
输出的JS代码包含
var author$project$SharedData$colors = _List_fromArray(
[
author$project$SharedData$black,
author$project$SharedData$white,
author$project$SharedData$red,
{blue: 11, green: 234, red: 123},
author$project$SharedData$black,
{blue: 11, green: 234, red: 123},
author$project$SharedData$red,
{blue: 11, green: 234, red: 123}
]);
这表明编译器能够重用预定义的颜色黑色、白色和红色,但在创建新记录时,即使使用完全相同的数据,也总会有重复
我不知道您的数据是如何组织的,但是对于上面的示例,我不会尝试优化数据结构,而是将颜色存储为十六进制代码字符串
我不是100%确定JS引擎如何处理字符串,但在许多其他平台上,单个字符串的堆中只有一个实例。对于上面的玩具应用程序,这意味着使用“7BEA0B”
而不是{red:123,green:234,blue:11}
我制作了一个简单的程序来查看编译后的JS输出。用Elm码
type alias Color = { red: Int, green: Int, blue: Int }
black: Color
black = { red = 255, green = 255, blue = 255 }
white: Color
white = { red = 0, green = 0, blue = 0 }
red: Color
red = { red = 255, green = 0, blue = 0 }
colors: List Color
colors =
[
black,
white,
red,
{ red = 123, green = 234, blue = 11 },
black,
{ red = 123, green = 234, blue = 11 },
red,
{ red = 123, green = 234, blue = 11 }
]
输出的JS代码包含
var author$project$SharedData$colors = _List_fromArray(
[
author$project$SharedData$black,
author$project$SharedData$white,
author$project$SharedData$red,
{blue: 11, green: 234, red: 123},
author$project$SharedData$black,
{blue: 11, green: 234, red: 123},
author$project$SharedData$red,
{blue: 11, green: 234, red: 123}
]);
这表明编译器能够重用预定义的颜色黑色、白色和红色,但在创建新记录时,即使使用完全相同的数据,也总会有重复
我不知道您的数据是如何组织的,但是对于上面的示例,我不会尝试优化数据结构,而是将颜色存储为十六进制代码字符串
我不是100%确定JS引擎如何处理字符串,但在许多其他平台上,单个字符串的堆中只有一个实例。对于上面的玩具应用程序,这意味着使用“7BEA0B”
而不是{red:123,green:234,blue:11}
遵循@kaskelotti建议,我制作了一个小程序,从字典中两次提取相同的项,如果数据共享,则使用JS调试器进行检查
import Html exposing (text,div)
import Dict
a = {t= "My name is a"}
b = {t= "My name is B"}
d = Dict.fromList [("a", a), ("b", b)]
mytest = List.filterMap (\key -> Dict.get key d) ["a", "b", "a"]
main =
let x = mytest
(y, z)= case x of
[a1,_,a2] -> (a1,a2)
_ -> (a,b)
in div [] (List.map (\o -> text o.t) mytest)
通过在main
中设置断点,我可以检查y
和z
实际上是相同的(y==z
为真)。同样修改y.t
修改z.t
根据@kaskelotti的建议,我制作了一个小程序,从字典中两次提取相同的项目,并使用JS调试器检查数据是否共享
import Html exposing (text,div)
import Dict
a = {t= "My name is a"}
b = {t= "My name is B"}
d = Dict.fromList [("a", a), ("b", b)]
mytest = List.filterMap (\key -> Dict.get key d) ["a", "b", "a"]
main =
let x = mytest
(y, z)= case x of
[a1,_,a2] -> (a1,a2)
_ -> (a,b)
in div [] (List.map (\o -> text o.t) mytest)
通过在main
中设置断点,我可以检查y
和z
实际上是相同的(y==z
为真)。另外modifyy.t
修改z.t
我也猜它会复制数据。这当然是实施细节,可能会有所改变。但由于所有数据都是不可变的,因此没有理由不能在内部共享。您可以制作一个小的测试Elm程序,看看编译后的JS输出是什么样子的。如果你走得那么远,把你的信息贴在这里让其他人知道细节。我也猜它会复制数据。这当然是实施细节,可能会有所改变。但由于所有数据都是不可变的,因此没有理由不能在内部共享。您可以制作一个小的测试Elm程序,看看编译后的JS输出是什么样子的。如果你走得那么远,把你的信息贴在这里让其他人知道细节。这真的很有帮助。在我的例子中,颜色实际上是一个单独的实体(具有名称、url、甚至图像等),因此将颜色存储为字符串不是一个选项。我更关心的是,当一个对象从字典中提取,然后通过一个函数,最后添加到某个地方时,是否会发生重复。这真的很有帮助。在我的例子中,颜色实际上是一个单独的实体(具有名称、url、甚至图像等),因此将颜色存储为字符串不是一个选项。我更关心的是,当从字典中提取一个对象,然后通过一个函数,最后添加到某个地方时,是否会发生重复。