2013-08-24 38 views

回答

7

一个重要的一句话:事实证明,需要这样的伎俩很多时候恰好是一个XY-问题(如误会很少变化的语义结果)。通常情况下,没有真正的使用情况下,你真的想要这个(在你减少,而不是总是定义一个默认值(所以它总是存在)被随意覆盖)。所以在使用下面的技巧之前,请确保它不是something else you want actually


这是很简单的(自V1.4.0),如果您需要为同一范围内提供这样的变量(即全局或局部),它可能已经被定义为:

@bar: 41; // comment/uncomment to test 

.define-bar-if-not-defined() {@bar: 42} 
.define-bar-if-not-defined(); // exposes a variable only if it's not already in this scope 

#using-global-bar { 
    global-bar: @bar; 
} 

#using-local-bar { 
    @bar: 43; // comment/uncomment to test 
    .define-bar-if-not-defined(); 

    local-bar: @bar; 
} 

然而,这方法将不起作用,如果您尝试将它用于本地作用域中使用的全局/父作用域变量(并且如果您不确定原始变量可能来自何种范围时需要泛型方法,则可能会出现问题) :

#using-unknown-bar-in-local-scope { 
    // ... some code ... 

    .define-bar-if-not-defined(); // won't override local @bar (if any) but always overrides global and parent scope @bar 

    bar: @bar; 
} 

在这种情况下,我不知道任何直接的解决方案(没有一些内联的JavaScript黑客可以用在警卫表达中)例如

+0

无论出于何种原因,这个方法在@导入字符串。尽管可以在样式定义中使用它,但编译器错误说明变量未定义。 – cameronhimself

+0

@cameronhimself这是预期的,因为在mixin之前评估进口。无论哪种方式,到目前为止,我没有看到任何需要这种功能的用例(我只是将这个问题作为一个假设来回答)。对于这种设施的每一个请求通常都是误解变量变量工作的结果(因此这是一个“XY问题”,更多细节参见[#1400](https://github.com/less/less)。 js/issues/1400),[#1706](https://github.com/less/less.js/issues/1706)等)。 –

+0

@cameronhimself换句话说,如果你有一个特定的用例,你认为你需要这种技巧 - 发布它 - 我很确定它可以用更简单的方法解决这个问题。 –