`exposing (..)` 在 Elm 中是什么意思?
What does `exposing (..)` mean in Elm?
我正在尝试理解 the very first Elm example,它有这个:
import Graphics.Element exposing (..)
exposing (..)
是什么意思?
这意味着您可以直接访问 Graphics.Element 模块中的所有内容,而无需先指定包。由于此示例仅使用 "show" 和 "Element",您可以将导入行更改为:
import Graphics.Element exposing (Element, show)
它仍然适用于此示例。
exposing (..)
允许您直接调用包中的所有函数
例如,如果 SamplePackage 具有函数 x 和 y,
import SamplePackage
会让你调用 SamplePackage.x
和 SamplePackage.y
,而
import SamplePackage exposing (..)
会让你调用 x
和 y
而无需指定它们的包含包。
请注意 import SamplePackage exposing (x)
可以让您直接调用 x
,但您仍然需要使用 SamplePackage.y
调用 y。同样,import SamplePackage exposing (x, y)
会让您调用 x
和 y
,但不能调用包中的任何其他函数。
这是一个老问题,但无论如何我都会用另一种方式回答 exposing (..)
,并解释一下为什么它通常不是一个好主意。如果您有 Python 编程背景,那么您可以将其视为 Python 中的 from module import *
。这个 Elm 代码:
import Graphics.Element exposing (Element, show)
在 Python 中看起来像这样:
from Graphics.Element import Element, show
而这个 Elm 代码:
import Graphics.Element exposing (..)
在 Python 中看起来像这样:
from Graphics.Element import *
前两个将 仅 添加名称 Element
和 show
到您当前模块的名称空间;后两个示例会将 all 来自 Graphics.Element
的名称添加到您的命名空间。这在您第一次编写模块时很方便,因为您可能还不知道 Graphics.Element
中需要什么名称。但是一旦你完成了模块的编写,返回并将 exposing (..)
更改为 exposing (just, the, names, you, need)
是明智的。这样您就可以确保以后不会发生任何名称冲突。
举例说明名称冲突可能造成的后果,假设您编写了一个名为 myGraphics
的模块,在其中创建了一个名为 rotatedImage
的函数,因为它(当前)不在 Graphics.Element
。但后来,Graphics.Element
添加了一个 rotatedImage
函数,语义略有不同(例如,你的函数使用度数,但 "official" 函数使用弧度)。现在有 两个 rotatedImage
函数可用于您的代码...您很容易被绊倒:
{- someOtherModule.elm -}
import Graphics.Element exposing (..)
{- ... more code ... -}
someImage = rotatedImage (pi / 2) sourceImage -- Angle is in radians
现在您需要与 myGraphics
模块不同的功能,因此导入它:
{- someOtherModule.elm -}
import Graphics.Element exposing (..)
import myGraphics exposing (..)
{- ... more code ... -}
someImage = rotatedImage (pi / 2) sourceImage -- WHOOPS, angle is now in degrees!
然后 someImage
的旋转突然改变了!当您导入 myGraphics
时,您是否打算更改 someImage
在您页面上的显示方式?几乎可以肯定不是。
这就是为什么一旦你的代码相对稳定就应该避免import Foo exposing (..)
。它在开发中非常有用,因为您不必经常返回代码顶部来为 import
语句添加另一个名称。但是一旦你完成了对你的模块的大量开发并且你只是偶尔对其进行更改,你真的应该切换到使用 import Foo exposing (just, the, names, you, need)
。这样你会躲过很多陷阱。
我正在尝试理解 the very first Elm example,它有这个:
import Graphics.Element exposing (..)
exposing (..)
是什么意思?
这意味着您可以直接访问 Graphics.Element 模块中的所有内容,而无需先指定包。由于此示例仅使用 "show" 和 "Element",您可以将导入行更改为:
import Graphics.Element exposing (Element, show)
它仍然适用于此示例。
exposing (..)
允许您直接调用包中的所有函数
例如,如果 SamplePackage 具有函数 x 和 y,
import SamplePackage
会让你调用 SamplePackage.x
和 SamplePackage.y
,而
import SamplePackage exposing (..)
会让你调用 x
和 y
而无需指定它们的包含包。
请注意 import SamplePackage exposing (x)
可以让您直接调用 x
,但您仍然需要使用 SamplePackage.y
调用 y。同样,import SamplePackage exposing (x, y)
会让您调用 x
和 y
,但不能调用包中的任何其他函数。
这是一个老问题,但无论如何我都会用另一种方式回答 exposing (..)
,并解释一下为什么它通常不是一个好主意。如果您有 Python 编程背景,那么您可以将其视为 Python 中的 from module import *
。这个 Elm 代码:
import Graphics.Element exposing (Element, show)
在 Python 中看起来像这样:
from Graphics.Element import Element, show
而这个 Elm 代码:
import Graphics.Element exposing (..)
在 Python 中看起来像这样:
from Graphics.Element import *
前两个将 仅 添加名称 Element
和 show
到您当前模块的名称空间;后两个示例会将 all 来自 Graphics.Element
的名称添加到您的命名空间。这在您第一次编写模块时很方便,因为您可能还不知道 Graphics.Element
中需要什么名称。但是一旦你完成了模块的编写,返回并将 exposing (..)
更改为 exposing (just, the, names, you, need)
是明智的。这样您就可以确保以后不会发生任何名称冲突。
举例说明名称冲突可能造成的后果,假设您编写了一个名为 myGraphics
的模块,在其中创建了一个名为 rotatedImage
的函数,因为它(当前)不在 Graphics.Element
。但后来,Graphics.Element
添加了一个 rotatedImage
函数,语义略有不同(例如,你的函数使用度数,但 "official" 函数使用弧度)。现在有 两个 rotatedImage
函数可用于您的代码...您很容易被绊倒:
{- someOtherModule.elm -}
import Graphics.Element exposing (..)
{- ... more code ... -}
someImage = rotatedImage (pi / 2) sourceImage -- Angle is in radians
现在您需要与 myGraphics
模块不同的功能,因此导入它:
{- someOtherModule.elm -}
import Graphics.Element exposing (..)
import myGraphics exposing (..)
{- ... more code ... -}
someImage = rotatedImage (pi / 2) sourceImage -- WHOOPS, angle is now in degrees!
然后 someImage
的旋转突然改变了!当您导入 myGraphics
时,您是否打算更改 someImage
在您页面上的显示方式?几乎可以肯定不是。
这就是为什么一旦你的代码相对稳定就应该避免import Foo exposing (..)
。它在开发中非常有用,因为您不必经常返回代码顶部来为 import
语句添加另一个名称。但是一旦你完成了对你的模块的大量开发并且你只是偶尔对其进行更改,你真的应该切换到使用 import Foo exposing (just, the, names, you, need)
。这样你会躲过很多陷阱。