7

特定の文字列の最初の文字を大文字にする必要があるLuaライブラリを開発しています。したがって、次の関数を作成しました。

local capitalize = function(s)
  return string.gsub (s,
    "(%w)([%w]*)",
    function (first, rest) 
      return string.upper(first) .. rest
    end, 
    1 )
end

これは当初、私のライブラリでのみ使用される「内部」関数でした。

これで、ユーザーがこの機能を使用したい場合があることに気付きました。

質問1 文字列テーブルを拡張することを考えていますが、どのように進めるかがわかりません。これを行うだけで十分ですか、それとももっと「ルア指向」の方法がありますか?

string.capitalize = function(s)
  ... etc etc (same code as above)

質問2 文字列をモンキーパッチするのもいいのではないかと思います。代わりに、パブリックな「資本化」機能を提供する必要がありますか?

編集-将来誰かがこれを見つけた場合に備えて、はるかに単純な「大文字化」機能が文字列レシピページに表示されます。

str = str:gsub("^%l", string.upper)
4

2 に答える 2

8

組み込みテーブルを頻繁に拡張します。私は主に、本当に重要な何かが欠けていると思うときにこれを行います。キャピタライゼーションは私の「重要な」リストにはなりませんでしたがstring.split、たとえば、呼ばれるものにはあります。

これを行うときは、プログラミング規約に従います。

require 'stringutil' -- load extra stuff into string.*
require 'osutil'     -- load extra stuff into os.*

あなたはその考えを理解します。

注意しているときに行うもう1つのことは、まだ存在していないものを上書きしないようにすることです。これにより、将来にわたって利用できるようになります。

function extend(tab, field, val)
   if tab[field] == nil then
     tab[field] = val
     return val
   elseif tab[field] ~= val then
     error(string.format('Extension %s.%s failed: already occupied by %s',
                         nameof(tab), field, tostring(val)))
   else
     return val
   end
end

nameof関数は次のようになります。

function nameof(val)
    for name, v in pairs(_G) do if v == val then return name end end
    return '?'
end

最後の注意:コードを他の人と共有する場合、事前定義されたテーブルを変更しない傾向があります。string黄金律によれば、その名前空間はすべての人によって共有されており、他の人に自分のコードを使用させる場合、事前定義されたテーブル で必要なフィールドを取得するだけでは公平ではありません。

于 2010-01-09T04:28:06.707 に答える
3

質問1の答えは「はい」です。質問2の答えは「好みの問題」です。

于 2010-01-09T02:10:05.303 に答える