2

関数 を作成しようとしていますgetInput(prompt, number)。ここpromptで、 はユーザーの入力の前に出力されるテキスト (例:>またはChoose a password:) でありnumber、入力が数値であるか任意のタイプであるかを示すブール値です。

ここに私が書いた関数があります:

function getInput(prompt, number)
    if number then
        while not input do
            io.write(prompt)
            input = tonumber(io.read())
        end
    else
        io.write(prompt)
        input = io.read()
    end
    return input
end

ただし、コードをかなり繰り返しています。私はio.write(prompt)2回書きましたがinput = io.read()、約1回tonumber()の呼び出しで2回書きました。私は基本的に同じことを 2 回繰り返してwhileいます。

ここに私が作った小さな回避策があります:

function getInput(prompt, number)
    while not input do
        io.write(prompt)
        input = io.read()
        if number then
            input = tonumber(input)
        end
    end
    return input
end

このバージョンは一度しか書かれていませんが、「適切な」コードではありませんio.write()。必要がなくてもループio.read()を使用しています( whenが false の場合)。また、ループのすべてのラウンドでチェックを行っています( trueの場合)。whilenumberif numberwhilenumber

最初のコードを使用する必要がありますか、または 2 番目のコードをより「適切」に改善する方法はありますか?

4

3 に答える 3

3

一般に、 に似た非常に単純な 1 行のコードを繰り返すことは、io.write(prompt)「コードの重複」とは認識されません。さらに、同じ単純な条件を繰り返しチェックすることは、通常、パフォーマンス上の問題とは見なされません。どちらの方法も同じように読みやすいので、好みに応じてどちらでもかまいません。

考えられる改善の 1 つは、次のnumberように、関数を 2 つに分割し、フラグを削除することです。

function getInput(prompt)
    io.write(prompt)
    return io.read()
end
function getNumericInput(prompt)
    while not input do
        io.write(prompt)
        input = tonumber(io.read())
    end
    return input
end

ただし、入力のタイプが実行時に決定され、変数を介して制御する必要がある場合、これは受け入れられない場合があります。

于 2013-05-10T16:14:05.520 に答える
1
local function getInput(prompt, number)
   io.write(prompt)
   local input = (number and tonumber or assert)((assert(io.read(), 'EOF')))
   return (input and function() return input end or getInput)(prompt, number)
end
于 2013-05-10T16:18:08.890 に答える
0

最初のフォームはかなり明確で読みやすいと思います。かなり似たようなステートメントを 2 回書いているにもかかわらず、ほとんど間違いはありません。

私が持っている唯一の提案は、ブールフラグなしで2つの関数(つまり、getInput(prompt)とgetNumericInput(prompt))に分割するか、ブール値をタイプに変更して、適切なタイプをキャプチャするためのロジックを移動することです別の方法に:

function getInput(prompt, type)
    io.write(prompt)
       input = getTypedInput(type)
    return input
end

function getTypedInput(type)
    input(io.read())
    ...change to type here <I don't know lua syntax)
    return input
end

数値または非数値よりも多くの型を使用する可能性があると思わない限り、後者はおそらくあなたが抱えている問題に対してやり過ぎです。

于 2013-05-10T16:21:10.063 に答える