答案 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 *
前两个仅将名称Element
和show
添加到当前模块的命名空间中;后两个示例会将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);
}
}
。你会以这种方式躲避许多陷阱。