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)写了两次,我也写了两次,input = io.read()其中tonumber()一个电话。我基本上只是重复同样的事情两次,一次在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()但它不是那个“正确”的代码。while即使不需要(何时number为假) ,我也在使用循环。我还在if number检查每一轮while循环(何时number为真)。

我应该使用第一个代码,还是有办法改进第二个代码更“正确”?

4

3 回答 3

3

一般而言,重复一段非常简单的单行代码类似于io.write(prompt)不会被认为是“代码重复”。此外,重复检查相同的简单条件通常不会造成性能危害。两种方式都具有同等的可读性,因此任何一种都可以,具体取决于您的喜好。

一种可能的改进是将函数分成两部分,并删除number标志,如下所示:

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

好吧,我想说第一种形式非常清晰易读。即使您两次编写非常相似的语句,它也几乎没有错误。

我唯一的建议是将其拆分为两个没有布尔标志的函数(即 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 回答