コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

利用者:Marsian/03

Qif も if も過去の遺物です。このページを読んでもあまり嬉しいことはありませんよ(void って言わない方がいいって指摘されてるのに直してない、とか)

⇒ Get m:ParserFunctions! Wikipedia:条件文!!

パラメタデフォルトのところもメタで日本語になってたかもしれないからあっちを見た方がいいかも

related pages:

これらを見ればわかるのだろうけど,なんかアレだから,なんとなく,しつこいくらいに解剖してみる.

パラメタデフォルトのおさらい

[編集]

まずパラメタデフォルトについて確認する.

いつ作動するのか?

[編集]

「デフォルト」とはどういうことか?曖昧でなくハッキリさせる必要がある.

パラメタデフォルト
テンプレートで,パラメタを定義しなかったときに,パイプの右側の値が自動的に代入される機能

ここで大事なことは,

パラメタを定義しなかった

であって,

パラメタにvoidを代入したときではない

ということだ(個人的なこと: これを勘違いしていたので理解が遅れた)

もうちょっと具体的に言ってくれないと……

[編集]

具体的に説明すると,Template:fooの中身が

{{{parameter|bar}}}

だったとして,

{{foo
}}

とすると(parameterパラメタが未定義)パラメタデフォルトが適用され,デフォルト値のbarが出力されるが,

{{foo
 |parameter=
}}

とすると,parameterパラメタにvoidが代入されるだけで,デフォルト値のbarは無視される.出力はvoid(何も出力されない)である.

{{{parameter|}}} と {{{parameter}}} の違い

[編集]

それでは {{{parameter|}}} と {{{parameter}}} の違いは大丈夫だろうか.実際に test.wikipedia で試すとすぐにわかるが,未定義の時にだけ差が出る.

{{foo
 |parameter=@
}}

には両方とも@を出力し,

{{foo
 |parameter=
}}

には両方ともvoidを出力する(何も出力しない)が,

{{foo
}}

では,前者はvoid(未定義なのでデフォルト値が入った),後者では{{{parameter}}}と出力されてしまう.未定義時にvoidを出したければパイプが必要,ということがわかった.

これだけは覚えておこう

[編集]

繰り返しになるけれど,

  • パラメタを未定義(「parameter=」すら書かない)

というのと,

  • パラメタを定義はしたが,そこに値は代入しなかった(これを「voidを代入した」と言うことにする)

というのは基本的には全く違うものだ,ということは頭に置いておこう.

さて,以上を踏まえてqifを解剖してみよう.

qifを解剖する

[編集]

とりあえず,いくつかのパタンについてだけ.全パタン網羅するのは面倒なので(そのうちやるかも).

ソースを見やすく書き換えてみる

[編集]

まず,ソースを見ると,qifでは他のテンプレートを呼び出すことはしておらず,単一のテンプレートとして作動することがわかる.そこで,パラメタのカッコ {{{ }}} を内側から順に ( ) [ ] { } で表すことにしよう.

するとソースは次のように書ける:

{  else(test|)  |  [ test(test|) | (then|) ]  }

見やすさを考え,いったん改行を加えて

{
 else(test|)  |  [ test(test|) | (then|) ]
}

としてみよう.

testを定義し,voidでない値を入れた場合

[編集]

全部定義し,全部にvoidでない値を入れた場合

[編集]
{{qif
 |test=foo
 |then=bar
 |else=2000
}}

スタートは,

{
 else(test|)  |  [ test(test|) | (then|) ]
}

まず ( ) について,testthenはパラメタとして認識され,voidでない値が代入されて,

{
 elsefoo  |  [ testfoo | bar ]
}

となる.elseは {{{else|hoge}}} の形になっていないため(← 不正確かも),パラメタとして認識されない.testfooのtestも同様.

次に [ ] について,testfooというパラメタの値は未定義なので,この時点でのデフォルト値,すなわち bar が入ることになり,

{
 elsefoo  |  bar
}

となる.改行は勝手に入れたものだから,これは

{ elsefoo  |  bar }

に等しい.

{ } についても全く同様に,elsefooというパラメタは未定義ので,この時点でのデフォルト値,すなわち bar が入ることになり,

bar

が出力される.実際は,{ } のelsefooについての処理は [ ] と同時に起きるのかもしれないが,testをvoid以外のfooと定義してしまった以上,elsefooというパラメタは確実に未定義になるので,どっちでも結果は同じ.

ところで,この例ではelseというパラメタが一度も使用されなかったelseはvoidでも未定義でも(= elseの行を書かなくても)よかったことになる.つまり,

{{qif
 |test=foo
 |then=bar
 |else=
}}

でも

{{qif
 |test=foo
 |then=bar
}}
でも,bar が出力される.

本当に?

[編集]

ソースを見て.

testを定義し,voidを代入した場合 & testが未定義の場合

[編集]

testを定義し,voidを代入した場合

[編集]

まず

{{qif
 |test=
 |then=bar
 |else=2000
}}

の場合.

スタートは,

{
 else(test|)  |  [ test(test|) | (then|) ]
}

まず ( ) について.testは定義し,voidを代入した(未定義ではない!).thenも定義し,には値 barを入れた.elseは定義したが,この時点ではパラメタと見なされない.よって,

{
 else  |  [ test | bar ]
}

となる.

次に [ ] について……と行ってもいいが,先に { } について考えてみる.なぜなら,

{  else  |  何か長いけど要はパラメタelseに対するデフォルト値  }

と見ることができるから,結局こっちを先に処理しても同じことになる(実際にはどちらが先か,同時かは知らないし,どっちでもいい).いまelseは定義されているのでデフォルト値は無視される.elseには値2000が代入され,

2000

が出力される.

結局,thenの値barは何であろうとよかったわけで,

{{qif
 |test=
 |then=
 |else=2000
}}

{{qif
 |test=
 |else=2000
}}
も同じく2000を出力する.

本当に?

[編集]

ソースを見て.

testが未定義の場合

[編集]
{{qif
 |then=bar
 |else=2000
}}

の場合.

スタートは,

{
 else(test|)  |  [ test(test|) | (then|) ]
}

まず ( ) について.testは未定義なので,デフォルト値(結局void)が適用される.thenはふつうに.elseはまだパラメタと見なされない.

{
 else  |  [ test | bar ]
}

やはり

{  else  |  何か長いけど要はパラメタelseに対するデフォルト値  }

になっていて,elseが定義されているので,デフォルト値は無視される.elseには値2000が代入され,

2000

が出力される.

これもやはり then が何だろうと関係ない.

{{qif
 |then=
 |else=2000
}}

{{qif
 |else=2000
}}
も同じく2000を出力する.

本当に?

[編集]

ソースを見て.

elseが未定義の場合

[編集]

testを定義し,voidでない値を入れた場合は,elseは未定義でも結果が変わらないことは既に見た(thenに入れた値が入る).ここではそれ以外のパタンを見てみよう.

testを定義し,voidを入れた場合

[編集]
{{qif
 |test=
 |then=bar
}}

とした場合.

スタートは,

{
 else(test|)  |  [ test(test|) | (then|) ]
}

まず ( ) について

{
 else  |  [ test | bar ]
}

となる.次に,

{  else  |  何か長いけど要はパラメタelseに対するデフォルト値  }

の形になっているので,やはり先に { } を考えてみよう.今回はelse が未定義なので,デフォルト値が生きて, [ test | bar ] となる. testは定義し,その値はvoidなので,結局voidが出力される(何も出力されない).

結局,thenの値barは何であろうとよかったわけで,

{{qif
 |test=
 |then=
}}

{{qif
 |test=
}}
も同じくvoidを出力することがわかる.

本当に?

[編集]

ソースを見て.

おまけ

[編集]

詳しい説明は(疲れてきたから)省くけど,testが未定義だったら最後のところでtestに対するデフォルトのbarが生きてbarが出力される.つまり,

{{qif
 |then=bar
}}

はbarを出力する.

では全部未定義だったら?

{{qif
}}

だと,

{
 else  |  [ test |  ]
}

となって,

{  else  |  }
だから,void.

本当に?

[編集]

ソースを見て.