什么`揭露(..)`在榆树中意味着什么?

时间:2015-05-11 16:28:02

标签: elm

我试图理解the very first Elm example并且有这个:

import Graphics.Element exposing (..)

exposing (..)是什么意思?

3 个答案:

答案 0 :(得分:12)

公开(..)允许您直接调用函数。例如,如果SamplePackage具有x和y函数,import SamplePackage将允许您调用SamplePackage.x和SamplePackage.y,而 import SamplePackage exposing (..)可以让你调用x和y而不指定它们的包含。

答案 1 :(得分:6)

这意味着您可以直接在Graphics.Element模块中访问所有内容,而无需先指定包。由于此示例仅使用“show”和“Element”,因此您可以将导入行更改为:

import Graphics.Element exposing (Element, show)

它仍然适用于这个例子。

答案 2 :(得分:5)

这是一个老问题,但无论如何我会以另一种方式回答exposing (..),并解释一下为什么它通常是一个坏主意。如果您有Python编程的背景知识,那么您可以将其视为Python中的from module import *。这个榆树代码:

import Graphics.Element exposing (Element, show)

在Python中看起来像这样:

from Graphics.Element import Element, show

而这个榆树代码:

import Graphics.Element exposing (..)

在Python中看起来像这样:

from Graphics.Element import *

前两个将名称Elementshow添加到当前模块的命名空间中;后两个示例会将Graphics.Element中的名称全部添加到您的命名空间。当您第一次编写模块时,这很方便,因为您可能还不知道Graphics.Element需要哪些名称。但是,一旦您完成了模块的编写,最好将exposing (..)更改为exposing (just, the, names, you, need)。这样你就可以确定以后没有任何名称冲突。

有关名称冲突可能不好的示例,请假设您编写了一个名为myGraphics的模块,在该模块中您创建了一个名为rotatedImage的函数,因为它不是(当前) Graphics.Element。但是稍后,Graphics.Element添加了一个rotatedImage函数,其语义略有不同(例如,您的函数使用了度数,但"官方"函数使用了弧度)。现在有两个 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)语句添加另一个名称。但是,一旦您完成了对模块的大量开发,并且您只是偶尔对其进行了更改,那么您应该切换到使用NodeContainer nodes; nodes.Create (25); MobilityHelper mobility; mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", DoubleValue (0.0), "MinY", DoubleValue (0.0), "DeltaX", DoubleValue (500), "DeltaY", DoubleValue (500), "GridWidth", UintegerValue (5), "LayoutType", StringValue ("RowFirst")); mobility.SetMobilityModel ("ns3::ConstantVelocityMobilityModel"); mobility.Install (nodes); for (uint n=0 ; n < nodes.GetN() ; n++) { Ptr<ConstantVelocityMobilityModel> mob = nodes.Get(n)->GetObject<ConstantVelocityMobilityModel>(); mob->SetVelocity(Vector(0, 10, 0)); } for (uint n=0 ; n < satellites.GetN() ; n++) { Ptr<ConstantVelocityMobilityModel> cvMob = satellites.Get(n)->GetObject<ConstantVelocityMobilityModel>(); Ptr<MobilityModel> mob = satellites.Get(n)->GetObject<MobilityModel>(); Vector m_position = mob->GetPosition(); Vector m_velocity = mob->GetVelocity(); if (m_position.y > 2500) { m_position.x += 257; m_velocity.y *= -1; cvMob->SetVelocity(m_velocity); mob->SetPosition(m_position); } } 。你会以这种方式躲避许多陷阱。