▼ 2008/03/03(月) Inflectorのバグ?要注意単語集。単数・複数変化もの
■ クラス名やモデル名に使う時に注意すべき単語
| 要注意タンゴ | |
| ox | 牛 |
| atlas | 地図 |
| genie | 魔神 |
| genus | 種類 |
| graffito | 掻き絵 |
| loaf | 塊 |
| money | 金 |
| move | 動き |
| mythos | 神話体系、価値観 |
| numen | 精霊 |
| penis | ペ ニス |
なぜ注意が必要?
Inflectorクラス分析-単語変化関数の使い方に書きましたが、CakePHPは、非英語圏の者にとっては、やっかいな単数、複数、大文字、小文字の変化の規約があります。
それを司るのが、Inflectorクラスです。
CakePHP 規約ワードメーカーを作っていて、Inflectorクラスのバグらしきものを発見しました。(バグなのか、仕様なのかよくわからないけど。)
CakePHPでは、通常のsをつけるだけの複数形ではなくて、特殊な変化系もサポートしていると、Inflectorクラス分析-単語変化関数の使い方で述べました。
例えば、単独だと
| 複数形 | 単数系 | 意味 |
| people | person | 人 |
| oxen | ox | 牛 |
こんな感じです。しかし、複数の単語を組み合わせた時に異変がっ!
| 複数形 | 単数系 | 意味 |
| good_people | good_person | 人 |
| good_oxen | good_oxen | 牛 |
と、牛さんは変化しません。
■ 原因と思われるもの
その原因は、Inflector.php のInflectorクラスの、function singularize($word)において、、、
if (preg_match('/(.*)\\b(' . $regexIrregular . ')$/i', $word, $regs)) {
$_this->singularized[$word] = $regs[1] . substr($word, 0, 1) . substr($irregular[strtolower($regs[2])], 1);
return $_this->singularized[$word];
}
というコードがあるのですが、複数の単語を組み合わせた場合は、これに引っかからないためです。peopleも、oxenと同じように、このルーチンには引っかからないのですが、peopleは、別の部分で、ちゃんと変化するよう手当がされており、そちらで上手に変化します。しかし、「牛」は忘れ去られてしまったようで。。。。。
コードをみる限りでは、本当は \\b という正規表現(単語境界にマッチ)が、「_(アンダースコア)]に、マッチすれば問題ないのですが、実験の結果、preg_matchでは、マッチしませんでした。また、マッチしたとしても、substr($word, 0, 1)の部分でおかしくなってしまうので、この部分は、根本的に見直すか、peopleと同じように、oxenについても、別ルールで手当する必要があります。
悲しき日本人
ただし、悲しきかな日本人。ひょっとしたら、このような不規則変化も意味あるのかも、なんて思ってしまって、コード修正はやめました。イングリッシュぺらぺらなら、直接質問するのですけどね~。
■ こんなことで時間を使いたくないでしょ。
以上のことを知っておかないと、以下はエラーになります。
コントローラーファイル名:big_oxen_controller.php モデルファイル名: big_ox.php
モデルファイル名は、big_oxen.php でないとダメです。しかも、テーブル名は、 big_oxens という、たぶんネイティブさんには許せない形をCakePHPは指示してきます。
という訳で、おとなしき日本人は、以下の単語を使う場合は、細心の注意を払いましょう。(単独で使う場合は大丈夫です。 small_atlases のように、複数組み合わせる時に注意です)
対象は少数
かなり特殊な単語ばかりですが、たまに money や atlas、moveなんかは、どこでも使いそうな感じですよね。それぞれの正しい複数形わかりますか?まあ、それは、Inflectorクラスを覗くか、辞書サイトで調べてみて下さい。普通の変化ではないです。
単独使用は問題なし。
繰り返しになりますが、単語ひとつで運用する場合は上記の要注意単語でも、問題はおきません。
many_oxen
のように、2つ以上の単語を組み合わせた時が要注意です。
他にもあるの?
たぶん、ないと思いますが。。。Inflectorクラスをみた方は、必ずしも、 $coreIrregularSingular で定義されているすべてが変なわけではありません。その中でも、一般ルールで対応できないのが、最初に抜き出した単語たちです。
というか。
単複の区別がない方が、、、いいなあ。womansでもいいだけどな~。
CakePHP 楽じゃないよ(英語わからんちんには)。全然。そんな貴方に
この情報は、
1.2.0.6311 beta ですので、いずれ改善?されるのかも知れません。
- TB-URL http://www.cpa-lab.com/tech/0101/tb/