榆树是共享对象还是复制对象?

问题描述 投票:0回答:2

我正在使用Elm前端的电子商务网站,我想知道对象是共享还是重复。我很确定答案,但我只是想确保。

[基本上,我有一个ProductVariant,其中包含一些Colour。目前ProductVariant作为字段colour_ids : List ColourId(这是我从json中获得的),但我正在考虑将ID替换为颜色本身:colours : List Colour。当我解码JSON之后就可以完成操作,而无需在colours词典中查找颜色。我是否正确地假设每个Colour将在不同的变体之间共享或每种颜色将被复制,从而占用更多的内存。

elm
2个回答
1
投票

我制作了一个简单的程序来查看已编译的JS输出。带有榆木代码

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 }


1
投票

按照@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中设置断点,我可以检查yz实际上是否相同(y === z为真)。同时修改y.t修改z.t

© www.soinside.com 2019 - 2024. All rights reserved.