我正在尝试创建一个函数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
为真时)。
我应该使用第一个代码,还是有办法改进第二个代码以使其“更合适”?
答案 0 :(得分: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
但是,在输入类型是在运行时决定的情况下,这可能是不可接受的,并且必须通过变量来控制。
答案 1 :(得分: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
答案 2 :(得分: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
后者对于你遇到的问题可能有点过分,除非你认为你有可能会使用更多的类型而不是数字或非数字。