条件式
条件式は、静的な言語に制御フローを提供し、条件付きインポート、ミックスイン、関数などを可能にします。以下の例は単なる例であり、推奨されていません 😃
if / else if / else
if条件式は期待通りに動作し、単純に式を受け入れ、trueの場合に次のブロックを評価します。ifと共に、典型的なelse ifとelseトークンがあり、フォールバックとして機能します。
以下の例では、paddingプロパティを条件付きでオーバーロードし、marginに置き換えます。
overload-padding = true
if overload-padding
padding(y, x)
margin y x
body
padding 5px 10px
overload-padding = true
if overload-padding
padding(y, x)
margin y x
body
padding 5px 10px
別の例
box(x, y, margin = false)
padding y x
if margin
margin y x
body
box(5px, 10px, true)
box(x, y, margin = false)
padding y x
if margin
margin y x
body
box(5px, 10px, true)
別のbox()ヘルパー
box(x, y, margin-only = false)
if margin-only
margin y x
else
padding y x
box(x, y, margin-only = false)
if margin-only
margin y x
else
padding y x
unless
Rubyプログラミング言語に精通しているユーザー向けに、unless条件式があります。これは基本的にifの反対、つまりif (!(expr))です。
以下の例では、disable-padding-overrideがundefinedまたはfalseの場合、paddingはオーバーライドされ、代わりにmarginが表示されます。しかし、trueの場合は、paddingは期待通りにpadding 5px 10pxを出力し続けます。
disable-padding-override = true
unless disable-padding-override is defined and disable-padding-override
padding(x, y)
margin y x
body
padding 5px 10px
disable-padding-override = true
unless disable-padding-override is defined and disable-padding-override
padding(x, y)
margin y x
body
padding 5px 10px
後置条件式
Stylusは後置条件式をサポートしています。つまり、ifとunlessは演算子として機能し、右辺の式が真の場合に左辺のオペランドを評価します。
例として、基本的な型チェックを実行するnegative()を定義しましょう。以下では、ブロックスタイルの条件式を使用します。
negative(n)
unless n is a 'unit'
error('invalid number')
if n < 0
yes
else
no
negative(n)
unless n is a 'unit'
error('invalid number')
if n < 0
yes
else
no
次に、関数を簡潔に保つために後置条件式を使用します。
negative(n)
error('invalid number') unless n is a 'unit'
return yes if n < 0
no
negative(n)
error('invalid number') unless n is a 'unit'
return yes if n < 0
no
もちろん、これをさらに進めることができます。例えば、n < 0 ? yes : noと書くことも、単純にブール値n < 0を使用することもできます。
後置条件式は、ほとんどの1行のステートメントに適用できます。例えば、@import、@charset、ミックスイン、そしてもちろん、以下に示すようにプロパティにも適用できます。
pad(types = margin padding, n = 5px)
padding unit(n, px) if padding in types
margin unit(n, px) if margin in types
body
pad()
body
pad(margin)
body
apply-mixins = true
pad(padding, 10) if apply-mixins
pad(types = margin padding, n = 5px)
padding unit(n, px) if padding in types
margin unit(n, px) if margin in types
body
pad()
body
pad(margin)
body
apply-mixins = true
pad(padding, 10) if apply-mixins
結果
body {
padding: 5px;
margin: 5px;
}
body {
margin: 5px;
}
body {
padding: 10px;
}
body {
padding: 5px;
margin: 5px;
}
body {
margin: 5px;
}
body {
padding: 10px;
}